Kaip patikrinti el. Pašto adresą naudojant įprastą išraišką?

Per daugelį metų aš lėtai sukūriau reguliarią išraišką, kuri teisingai patvirtina teisingus MOST el. Pašto adresus, o tai rodo, kad jie nenaudoja IP adreso kaip „backend“.

Aš jį naudoju keliose PHP programose, o tai dažniausiai veikia. Tačiau kartais susidūriau su asmeniu, turinčiu problemų su svetaine, kuri ją naudoja, ir galiausiai turiu atlikti tam tikrus pakeitimus (visai neseniai supratau, kad neleidžiau naudoti 4 ženklų TLD).

Koks yra geriausias regex, ar jūs matėte el. Pašto tikrinimą?

Aš mačiau keletą sprendimų, kurie naudoja kelias trumpesnes išraiškas naudojančias funkcijas, bet norėčiau turėti vieną ilgą sudėtingą išraišką paprastoje funkcijoje, o ne keliose trumpose išraiškose sudėtingesnėje funkcijoje.

2967
14 окт. Acrosman nustatė 14 d. 2008-10-14 17:14 '08 at 17:14 pm 2008-10-14 17:14
@ 77 atsakymai
  • 1
  • 2
  • 3

visiškai suderinama su RFC 822 regex, yra neveiksminga ir neaiški dėl jos ilgio. Laimei, RFC 822 buvo pakeistas du kartus, o dabartinė RFC 5322 el. Pašto adresų specifikacija. RFC 5322 veda prie reguliarios išraiškos, kuri gali būti suprantama, jei ji tiriama per kelias minutes ir yra pakankamai efektyvi faktiniam naudojimui.

Viena reguliari raiška, kuri palaiko RFC 5322, yra http://emailregex.com/ viršuje, bet naudoja IP adresą, kuris plaukioja aplink internetą su klaida, leidžiančia 00 bet kuriam nepasirašytam dešimtainiam skaičiui adreso su taškų ribotojai, kurie yra neteisėti. Likusi dalis atitinka RFC 5322 gramatiką ir atlieka kelis testus, naudodama grep -Po , įskaitant domenų vardus, IP adresus, blogus adresus ir paskyrų pavadinimus su ir be kabučių.

Klaidos 00 pataisymas IP šablone, gauname veikiančią ir gana greitą reguliarią išraišką. (Nukopijuokite faktinį kodą, o ne pažymėjimą).

(: [a-z0-9 # $% '* + / = ^ _ `{|} ~ -!?] + (?:?.! \ t = ^ _ `{|} ~ -] +) * |" (:? [x01- x8 x0b x0c x0- x1f x21 x23- X5b x5d-xx7f] | [x01-09 x0b x0c x0- x7f]) * ") @ (: (: [a-z0-9] (: [a-z0-9-] * [a-z0-9 ] + [a-z0-9] (?. [a-z0-9 -] * [a-z0-9]) | [(:(?: (2 (5 [0-5] [0-4] [0-9]) | 1 [0-9] [0-9] | [1-9] [0-9]?)))) {3} (? :( 2 ( 5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] |? [1-9] [0-? 9]) | [a-z0- 9 -] * [a-z0-9] (: [x01- x8 x0b x0c x0- x1f x21- X5a x53- x7f] | xc x0- x7f]) +)

Čia yra valstybinės mašinos diagrama , skirta aukštesniam, labiau suprantamai nei įprastai išraiškai 2019

14 окт. atsakymas, kurį pateikė bortzmeyer 14 spalis 2008-10-14 17:26 '08 at 17:26 pm 2008-10-14 17:26

Negalite naudoti įprastų išraiškų, kad patvirtintumėte el. Pašto adresus.

Vietoj to, naudokite „ MailAddress“ klasę, pavyzdžiui:

 try { address = new MailAddress(address).Address; } catch(FormatException) { //address is invalid } 

„MailAddress“ klasė naudoja BNF analizatorių, kad patvirtintų adresą visiškai laikantis RFC822.

Jei tikrai norite naudoti įprastą išraišką, čia jis yra :

  (?: (?: r)) []] * (?: (?: (?: [^ () <> @;;: " ] + (?: (?: (?: r))? ) + | Z | (? = [["() <> @;;" "[...])) |" (?: [^ "R] | | (?: (?: r?)? []]) * "(? :(?: r (i) (?: (?: r)) [[]] * (?: [^ () <> @;;::? „[000] +1] + (? :(? :( r: n) []] + | Z | (? = [["() <> @;;" "[...])) |" (?: [ ^ "r" | | (?: (?: r)?  ])) * "(?: (?: r)? []] *)) * @ (?: (?: r)? []] * (? [^ () <> @,;: " 31] + (?: (?: (?: R)) [[]] + | Z | (? = [["() <>;;:". ]])) | [([^] \ t ] (?: (?: r)? []] *) (?: (?: (?: r)? []] * (?: [^ () <> @,;:: (?: (?: (?: r)) []] + | Z | (? = [["() <> @;;:" [([^ [] [] [] (?: r)? []] *)) * | (?: [^ () <> @;; ". (?: (?: r)? []] + | | (? = [["() <> @);)" "(?: [^" r] | r: n) []]) * "(?: (?: r) <(?) *) * <(?: (?: r)? []] * (?: @ (?: [^ () <> @; [000] 031] + (?: (?: (?:) r)) []] + | Z | (? = [["() <> @;;" "[] [] ] r] | *) * * (?: (?: r)?  ]) *) (?: (?: (?: r)? []] * (?: [^ () <> @;; " 000 - 031 + (?: (?: (?: R)) [[] [] [] [] [] [] [] [] [] [] [...] ] | *) * * (?: (?: r)? ) *)) * (?:, @ (?: (?: r)? []] * (?: [^ () <> @;;: ". 000- 031] + (?: (?: (?: R))?  ]) + | Z | (? = [["() <>;;:" []])) [([^ []] \ t ) * * (?: (?: r)? []] * ) (?: (?: (?: r)? []] * (?: [^ () <> @;: " ] + (?: (?: (?: r))? ) + | Z | (? = [["() <> @;;" "[] [] [] [] [] [R] | .) *] (?: (?: r)? []] *)) *) *: (?: (?: r); []] *)? (?: [^ () <> @;: ". (a: (?: (?: r)? [[]] + Z | (? = [["() <> @,;:" ([]])) | "(?: [^" R] | ?: (?: r)? [])) * "(?: (?: r) n) []] *) (?: (?: (?: r)? []] * (?: [^ () <> @; [000] 031] + (? :(? :(?: r n)? []] + | Z | (? = [["() <> @;;" "[]])) |" (?: [^ "r" | | | (?: (?: r); ])) * "(?: (?: r)? []] *)) * @ (?: (?: r)? []] * (?: [^ () <> @,;: " ] + (?: (?: (?: r)) []] + | Z | (? = [["() <>;;:" ])) | [([^ []] \ t ?: (?: r)? []] *) (?: (?: (?: r)? []] * (?: [^ () <> @,;: ". : (?: (?: r)) []] + | Z | (? = [["() <>;;":))) | [([^ [] r] |) * * (? :(? : n)? []] *)) *> (?: (?: r)? []] *) | (?: [^ () <> @; : [...] [...] [...] [...] + (? :(? : (?: r n)? []] + | Z | (? = [["() <> @;:" ()])) | "(? : [^ "r] | | (?: (?: r)? [])) * "(?: (?: r)? []] *) *: (?: (?: r)? []] * (?: (?: (?: [^ () <> @;;: \ T  000 - 031] + (?: (?: (?: R)) [T]) + | Z | (? = [["() <> @; []])) | "(?: [^" r] | | (?: (?: r)) []]) * "(?: (?: r)? []] *) (?: (? : (?: r)? []] * (?: [^ () <> <...> [...] [...] [...] [...] (+:?: (?: (?: R)? [T]) + | Z | (? = [\ T "() <> @,;::"] \ T (?: [^ "r] | | (?: (?: r)) [[t]) *" (?: (?: r)? ]) *)) * @ (?: (?: r)? ) * (?: [^ () <> @,;:: "[...] 031] + (?: (?: (?: R n)? [[T]) Z | (? = [["() <> @;;:: \ T [([] [] [] [] [] [] [] [] [] [?] ) (?: (?: (?: r)? []] * (? : [^ () <> @,;: "[...] 031] + (?: (?: (?: R)? [T]) + | | (? = [["() <> @;;: \ T ]])) | [([^ [r]]) * * (?: (?: r)? []] *)) * | (?: [^ () <> @,;: \ T 031] + (?: (?: (?: R)? [T]) + | Z | (? = [["() <> @; ]])) | "(?: [^" r] | a: (a: r)? [])) * "(?: (?: r)? []] *) * (?: (?: r); n)? [] * (?: @ (?: [^ () <>; [...] [...] +1] + (?: (?: (?: R)? [T]) + | Z | (? = [["() <> @,;: "" [] ^ [] r]) * * * (?: (?: r)? []] *) (?: (?: (?: R) n)? [] * (?: [^ () <> @;;: 000 - 031] + (?: (?: (?: R)) []] + | Z | (? = [["() <> @ ": [...])) | r) | *) * * (?: (?: r); []] *)) * (?:, @ (?: (?: r) )? [] * (?: [^ () <> @;;: ". [...] 031] + (?: (?: (?: R)? []] + | Z | (? = [["() <>; „([]])) | r] |) * * (?: (?: r)? []] *) (?: (?: (?: r)? t]) * (?: [^ () <> @;;: \ t  000 - 031] + (?: (?: (?: R)) [T]) + | Z | (? = [["() <> @; []])) | ) * * (?: (?: r)) []] *)) *) *: (?: (?: r)? )? (?: [^ () <> @,;: " 00 - 031] + (?: (?: (?: R)? [T]) + | Z | (? = [["() <>;;:" []])) | "(?: [^" r] . (?: (?: r); []]) * "(?: (?: r)) [[t]) *) (?: (?: ( ?: r)) []] * (?: [^ () <> @, [...] [03] [+] ([:] = (?: R)? [T]) + | ) <> @,;:: "[]])) |" (? : [^ "r] | | (?: (?: r)? []]) *" (?: (?: r))? ]) *)) * @ (?: (?: r)? [] (?: [^ () <> @,;: "[...] 031] + (?: (?: (?: Rn)? []] + | Z | (? = [["() <> @;;:". [(]])) | [([^ [r]] | * * * (?: (?: r)? [] \ t ?: (?: (?: r)? []] * (?: [ ^ () <> @,;: "- 000 - 031] + (?: (?: (?: R)? [T]) + | ? = [["() <> @;;:" \ T ])) | [([^ [] r]] * * (?: (?: r)? []] *)) * ?: (?: r)? []] *) (?:, s * ( ?: (?: [^ () <> @,;: ". [...] 031] + (?: (?: (?: R n)? [[T]) Z | (? = [["() <> @;;:: \ T "[...])) |" (?: [^ "r] | | (?: (?: r)? []]) *" (? : (?: r)? []] *) (?: (?: ?: r)) []] * (?: [^ () <> @,;: "... [...] 031] + (? :(? :(? : n)? []] + | Z | (? = [ ["() <> @,;:" "[]]))" "(?: [^" r] | | (?: (?: r) n)? [])) * "(?: (?: r); ]) *)) * @ (?: (?: r)? []] * (?: [^ () <> @;;: ". 031] + (a: (?: (?: R)) [T ]) + | Z | (? = [["() <> @; [...]]) | [([^ [] R] | *) * (?: (?: r)) [?] *) (? : (?: (?: r); []] * (?: [^ () <> @;;: "\ t ?: (?: (?: r)? []) + | Z | (? = [["() <> @;;:" [] [] [] [] [] [] ] (?: (?: r)? []] *)) * | (?: [^ () <> @,;: "[...] 031] + (?: (?: (?: R)? [T]) + | (? = [["() <> @;;: \ T ]])) | "(?: [^" r] | (?: (?: r)? []]) * "(?: (?: r)) []] *) * <(?: (?: r) [?] * (?: @ (?: [^ () <> @;;: ". [...] 031] + (?: (?: (?: n) [[]] + | Z | (? = [\ t () <> @,;: "[] [] [] [] [] [] n) []] *) (?: (?: (?: r) [?] * (?: [^ () <> @,;: "[...] 031] + (?: (?: (?: r)? []) + | Z | (? = [["() <> @,;: "[...])) | [([^ [] r] | *) * (?: (?: r)? []) *)) * (?:, @ (?: (?: r))?  ]) * (?: [^ () <> @,;: "[...] 031] + (?: (?: (?: r))? t]) + | Z | (? = [["() <> @, [: [] [] [] [] [...] [] [] t]) *) (?: (?: (?: r)? ) * (?: [^ () <> @,;:: "[...] 031] + (?: (?: (?: R n)? [[T]) Z | (? = [["() <> @;;:: \ T [([] [] [] [] [] [] [] [] [] [?] )) *) *: (?: (?: r)? []] *)? (?: [^ () <> @,;: "[...] 031] + (?: (?: (?: Rn)? []] + | Z | (? = [["() <> @;;:". []])) | "(?: [^" r] | | (?: (?: r)? []]) * "(? :( r:) [?] *) (?: (? :(?:) r (n)? []] * (?: [^ () <> @;;: ". r)) [[]] + | Z | (? = [ "() <> @,;:" "[]]))" "(?: [^" r] | | (?: (?: r) [[]]) * "(?: (?: r)? [] \ t *)) * @ (?: (?: r)? []] * (?: [^ () <> @;;: " + (?: (?: (?: r))? Z | (? = [["() <> @,;:" [] [] [] [] [] [] ) * * (?: (?: r)? []] *) (?: (?: (?: r?)? []] * (?: [^ () <> @;;: ". (?: (?: r)? []] + | | (? = [["() <> @;;:" [] [] [] [] [] (?: (?: r)? []] *)) * r: n) []] *)) *) ?; 
707
14 дек. Atsakymas pateikiamas SLaks 14 d. 2009-12-14 23:43 '09, 23:43, 2009-12-14 23:43

Šis klausimas dažnai užduodamas, bet manau, kad reikia atsigręžti ir paklausti savęs, kodėl norite sintaksiškai patikrinti el. Pašto adresus? Koks naudojimas iš tikrųjų?

  • Jis nesulauks bendrų rašmenų.
  • Tai netrukdo žmonėms įvesti neteisingus ar sukurtus el. Pašto adresus arba įvesti kitą adresą.

Jei norite patikrinti el. Pašto adreso galiojimą, jūs neturite kito pasirinkimo, kaip siųsti patvirtinimo el. Laišką ir atsakyti į jį. Daugeliu atvejų dėl saugumo priežasčių ar dėl etinių priežasčių turėsite bet kuriuo atveju atsiųsti patvirtinimo laišką (todėl, pavyzdžiui, negalite pasirašyti asmens, galinčio naudoti paslaugą prieš savo valią).

504
14 окт. JacquesB spalio 14 d. atsakymas . 2008-10-14 22:40 '08 10:40 pm 2008-10-14 22:40

Tai priklauso nuo to, ką reiškia: Jei kalbate apie visų galiojančių el. Pašto adresų užfiksavimą, naudokite šiuos veiksmus:

http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html ) Jei ieškote kažko paprastesnio, tačiau jis sugaus daugumą galiojančių el. pašto adresų, pabandykite kažką panašaus: 

322
05 апр. atsakymą pateikė geras žmogus 05 balandžio. 2009-04-05 22:39 '09 at 22:39 PM 2009-04-05 22:39

Viskas priklauso nuo to, kaip tiksliai esate. Mano tikslams, kai aš tiesiog bandau išsaugoti tokius dalykus kaip bob @ aol.com (tarpai el. Laiškuose) arba steve (be jokių domenų) arba mary@aolcom (nėra laikotarpio prieš .com), naudoju

 /^\S+@\S+\.\S+$/ 

Žinoma, tai atitiks dalykus, kurie nėra galiojantys el. Pašto adresai, tačiau tai yra žaidimo klausimas su 90/10 taisyklė.

306
14 окт. Atsakymą pateikė Andy Lester spalio 14 d. 2008-10-14 17:42 '08 at 5:42 pm 2008-10-14 17:42

[UPDATED] Surinkiau viską, ką žinau apie el. Pašto adresų tikrinimą čia: http://isemail.info , kuris dabar ne tik patikrina, bet ir diagnozuoja su el. Pašto adresais susijusias problemas. Sutinku su daugeliu komentarų, kad patvirtinimas yra tik dalis atsakymo; Žr. Mano esė http://isemail.info/about .

is_email (), kiek aš žinau, išlieka vienintelis validatorius, kuris pagaliau pasakys, ar ši eilutė yra galiojantis el. pašto adresas, ar ne. Atsisiųsdavau naują versiją šiuo adresu: http://isemail.info/

Surinkiau bandymų pavyzdžius iš Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 ir RFC 3696. Iš viso 275 bandymų adresai. Visus šiuos testus atlikiau su visais nemokamais validatoriais, kuriuos galėjau rasti.

Stengsiu atnaujinti šį puslapį, nes žmonės padidina savo patikimumo efektyvumą. Ačiū Cal, Michael, Dave, Paul ir Phil už pagalbą ir bendradarbiavimą rengiant šiuos testus ir konstruktyviai kritikuojant RFC 3696 . Trys iš kanoninių pavyzdžių yra neteisingi adresai. Ir maksimalus adreso ilgis yra 254 arba 256 simboliai, o ne 320.

282
10 февр. Atsakymą pateikė Dominic Sayers , vasario 10 d. 2009-02-10 19:13 '09 19:13 2009-02-10 19:13

W3C HTML5 specifikacija :

apgalvotas RFC 5322 pažeidimas , kuriame apibrėžiama pernelyg griežtų el. Pašto adresų sintaksė (prieš simbolį „@“), pernelyg neaiški (po „@“ simbolio) ir per silpna (leidžia komentarus, tarpą ir cituotas eilutes) daugeliui vartotojų nepažįstamų būdų) praktiniam naudojimui čia. 

Ši standartinė „JavaScript“ ir „Perl“ suderinama išraiška yra pirmiau pateiktos apibrėžties įgyvendinimas.

246
12 янв. Atsakymą pateikė Josh Stodola 12 sausis 2012-01-12 05:24 '12 at 5:24 2012-01-12 05:24

Lengvas Perl 5.10 ar naujesnėje versijoje:

195
ответ дан Abigail 17 дек. '09 в 0:44 2009-12-17 00:44

Aš naudoju

var _tmr = window._tmr || (window._tmr = []);_tmr.push({id: "2334768", type: "pageView", start: (new Date()).getTime()});(function (d, w, id) {  if (d.getElementById(id)) return;  var ts = d.createElement("script"); ts.type = "text/javascript"; ts.async = true; ts.id = id;  ts.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//top-fwz1.mail.ru/js/code.js";  var f = function () {var s = d.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ts, s);};  if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); }})(document, window, "topmailru-code");