Normal bir ifade kullanarak bir e-posta adresini nas─▒l do─črular─▒m?


Al─▒nan cevaba git


Y─▒llar ge├žtik├že, sunucu par├žas─▒ olarak bir IP adresi kullanmad─▒klar─▒n─▒ farz ederek MOST e-posta adreslerini do─čru ┼čekilde do─črulayan d├╝zenli bir ifade geli┼čtirdim .

Birka├ž PHP program─▒nda kullan─▒yorum ve ├žo─ču zaman ├žal─▒┼č─▒yor. Bununla birlikte, zaman zaman, onu kullanan bir siteyle ilgili sorun ya┼čayan bir ki┼či ile ileti┼čim kuruluyor ve baz─▒ ayarlamalar yapmak zorunda kal─▒yorum (en son 4 karakterlik TLD'lere izin vermedi─čimi fark ettim).

E-postalar─▒ do─črulamak i├žin g├Ârd├╝─č├╝n├╝z veya g├Ârd├╝─č├╝n├╝z en iyi normal ifade nedir?

Birka├ž k─▒sa ifade kullanan i┼člevleri kullanan birka├ž ├ž├Âz├╝m g├Ârd├╝m, ancak daha karma┼č─▒k bir i┼člevde birka├ž k─▒sa ifade yerine basit bir i┼člevde bir uzun karma┼č─▒k ifadeye sahip olmay─▒ tercih ederim.


3184









Cevap say─▒s─▒n─▒ say: 30






Tam RFC 822 uyumlu regex verimsiz ve uzunlu─ču sebebi ile karanl─▒k oldu─čunu. Neyse ki, RFC 822 iki kez de─či┼čtirildi ve e-posta adresleri i├žin ge├žerli ┼čartname RFC 5322 . RFC 5322, birka├ž dakika ├žal─▒┼č─▒ld─▒─č─▒nda anla┼č─▒labilecek ve ger├žek kullan─▒m i├žin yeterince verimli bir regex'e yol a├žar.

Bir RFC 5322 uyumlu regex, sayfan─▒n en ├╝st├╝nde http://emailregex.com/ adresinde bulunabilir, ancak internet ├╝zerinde dola┼čan IP adres modelini 00 kullanarak i┼čaretsiz bayt ondal─▒k de─čerlerinden herhangi birine izin veren bir hatay─▒ kullan─▒r. s─▒n─▒rland─▒r─▒lm─▒┼č adres, bu ge├žersiz. Geri kalan─▒n─▒n RFC 5322 dilbilgisi ile tutarl─▒ oldu─ču g├Âr├╝l├╝yor ve grep -Po vaka adlar─▒, IP adresleri, hatal─▒ adresler ve t─▒rnakl─▒ ve t─▒rnaks─▒z hesap adlar─▒ da dahil olmak ├╝zere ├že┼čitli testlerden ge├žiyor .

D├╝zeltme 00 IP desende hata, bir ├žal─▒┼čma ve olduk├ža h─▒zl─▒ regex elde ederiz. (Ger├žek kod i├žin olu┼čturulan s├╝r├╝m├╝ i┼čaretleyin, de─čil, i┼čaretleyin)

(: [A-z0-9 # $% & '* + / = ^ _ `{|} ~ -? + (?.!: \ [A-z0-9 # $% &!]'? * + / ? = ^ _ `{|} ~ -] +) * |" (: [\ x01- \ X08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ X5b \ x5d- \ x7f] | \\ [\ x01- \ X09 \ x0b \ x0c \ x0e- \ x7f]) * ") '(: (: [a-0-9] (:? [a-z0-9 -] * [a-z0 -9]) \) + [a-0-9] (:.?? [a-z0-9 -] * [a-0-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- \ X08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7f] | \\ [\ x01- \ X09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

─░┼čte ┼čemas─▒ aras─▒nda sonlu durum makinesi regexp'nin kendisinden daha a├ž─▒k yukar─▒da regexp'nin i├žin
g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Perl ve PCRE'deki (├Ârne─čin PHP'de kullan─▒lan regex k├╝t├╝phanesi) daha sofistike modeller RFC 5322'yi sorunsuzca ayr─▒┼čt─▒rabilir . Python ve C # da bunu yapabilir, ancak ilk ikisinden farkl─▒ bir s├Âzdizimi kullan─▒yorlar. Ancak, daha az g├╝├žl├╝ desen e┼čle┼čtirme dillerinden birini kullanmaya zorlan─▒yorsan─▒z, ger├žek bir ayr─▒┼čt─▒r─▒c─▒ kullanmak en iyisidir.

Ayr─▒ca, RFC'ye g├Âre onaylaman─▒n, bu adresin sa─članan alanda ger├žekten var olup olmad─▒─č─▒ veya adrese giren ki┼činin ger├žek sahibi olup olmad─▒─č─▒ hakk─▒nda kesinlikle hi├žbir ┼čey s├Âylemedi─čini anlaman─▒z ├Ânemlidir. ─░nsanlar her zaman bu ┼čekilde posta listelerine kaydolurlar. Bunun d├╝zeltilmesi, daha ├Ânce bu t├╝r bir adrese oldu─ču gibi ayn─▒ web sayfas─▒na girilmesi gereken bir onay belirteci i├žeren bir iletinin g├Ânderilmesini i├žeren bir ├že┼čit onaylay─▒c─▒ gerektirir.

Onay belirte├žleri, giren ki┼činin adresini bildi─činizi bilmenin tek yoludur. Bu nedenle ├žo─ču posta listesi ┼čimdi kaydolmay─▒ onaylamak i├žin bu mekanizmay─▒ kullan─▒yor. Ne [email protected] de olsa , herhangi birileri bast─▒rabilir ve bu yasal bile olsa ayr─▒┼čt─▒r─▒r, ancak di─čer taraftaki ki┼či olmas─▒ muhtemel de─čildir.

PHP i├žin, gereken de─čil , belirtilen modeli kullanmak do─črula'da PHP ile bir E-Posta Adresi, Do─čru hangi aynen aktar─▒yorum:

Yayg─▒n kullan─▒m ve yayg─▒n ├Âzensiz kodlaman─▒n, e-posta adresleri i├žin kaydedilen resmi standarttan daha k─▒s─▒tlay─▒c─▒ olan fiili bir standart olu┼čturma tehlikesi vard─▒r.

Di─čer t├╝m RFC d─▒┼č─▒ modellerden daha iyi de─čil. Hatta i┼člemek i├žin bile ak─▒ll─▒ yeterli de─čildir RFC 822 , tek ba┼č─▒na RFC 5322. izin Bu bir Ancak oldu─čunu.

Fantezi ve bilge olmak istiyorsan─▒z, tam bir devlet motoru uygulay─▒n . D├╝zenli bir ifade ancak basit bir s├╝zge├ž i┼člevi g├Ârebilir. D├╝zenli ifadelerle ilgili sorun, birisine m├╝kemmel ge├žerli bir e-posta adresinin ge├žersiz oldu─čunu (yanl─▒┼č bir pozitif) s├Âylemesidir, ├ž├╝nk├╝ normal ifadenizin kullanamad─▒─č─▒ durum yaln─▒zca kullan─▒c─▒ a├ž─▒s─▒ndan kaba ve kabad─▒r. Ama├ž i├žin bir durum motoru, her bir RFC'ye g├Âre e-posta adresini s├Âkerken ge├žersiz say─▒labilecek e-posta adreslerini hem do─črulayabilir hem de d├╝zeltebilir. Bu, potansiyel olarak daha ho┼č bir deneyim i├žin izin verir

Belirtilen e-posta adresi 'myemail @ address, com' ge├žersiz. '[email protected]' mu demek istediniz?

Ayr─▒ca , yorumlar dahil, E-posta Adreslerini Do─črulama b├Âl├╝m├╝ne de bak─▒n . Veya Normal ─░fadeleri Do─črulayan E-posta Adresini Kar┼č─▒la┼čt─▒rma .


D├╝zenli ifade g├Ârselle┼čtirme

Debuggex Demo


2310







E-posta adreslerini do─črulamak i├žin normal ifadeler kullanmamal─▒s─▒n─▒z.

Bunun yerine, MailAddress s─▒n─▒f─▒n─▒ ┼č├Âyle kullan─▒n :

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

MailAddress s─▒n─▒f─▒, adresi RFC822 ile tam olarak do─črulamak i├žin bir BNF ayr─▒┼čt─▒r─▒c─▒s─▒ kullan─▒r.

Ger├žekten bir regex kullanmak istiyorsan─▒z, i┼čte burada :

(?: (?: \ r \ n)? [\ t]) * (?: (?: (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031 ] + (?: (?: (?: \ r \ n)? [\ t]
(? = [\ [) + | | \ Z "() <> ',;: \\" \ [\]])) | "([^ \?" \ R \\] | \\.. | (?: (?: \ r \ n)? [\ t])) * "(? :( ?:
\ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,:: \ \ ". \ [\] \ 000- \ 031] + (? :(? :(
?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]])) | "(?: [ ^ \ \ "r \\] | \\ |. (:? (: \ r \ n) [? 
\ t])) * "(?: (?: \ r \ n)? [\ t]) *)) * @ (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 0
31] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\ ]])) | \ [([^ \ [\] \ r \\] |. \\) * \
] (?: (?: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] +
(?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]]) ) | \ [([^ \ [\] \ r \\] | \\) * \.] (?:
(?: \ r \ n)? [\ t]) *)) * | (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> ',;: \\". \ [\]]).?) |? "([^ \ \" R \\] | \\ | (:( ?: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)
? [\ t]) *) * \ <(?: (?: \ r \ n)? [\ t]) * (?: @ (?: [^ () <> @,;: \\ "). \ [\] \ 000- \ 031] + (?: (?: (?: \
r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]]))) | \ [([^ \ [\ ] \ r \\] | \\) * \]. (:? (: \ r \ n)? [
 \ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] (+: (: (: \ r \ n)
? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]])) | | [[([^ \ [\] \ r \ \] | \\.) * \] (?: (?: \ r \ n)? [\ t]
) *)) * (?:, @ (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] (+: (: (:? \ r \ n) [
 \ T]) + | \ Z | (=? [\ [ "() <> ',;: \\". \ [\]])) | \ [([^ \ [\] \ R \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *
) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031 ] + (?: (?: (?: \ r \ n)? [\ t]
) + | \ Z | (= [\ [? "() <> ',;: \\". \ [\]])) | \ [([^ \ [\] \ R \\] | \\ .) * \] (?: (?: \ r \ n)? [\ t]) *)) *)
*: (?: (?: \ r \ n)? [\ t]) *)? (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) +
| \ Z | (= [\ [ "() <> ',;: \\"?. \ [\]]).) |? "([^ \ \" R \\] | \\ | ( ?: (?: \ r \ n)? [\ t])) * * (?: (?: \ r
\ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ " . \ [\] \ 000- \ 031] + (? :(? :( ?:
\ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]])) | "(?: [^ \ "\ r \\] | \\. | (?: (?: \ r \ n)? [\ t
])) * "(?: (?: \ r \ n)? [\ t]) *)) * @ (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031
] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\] ])) | \ [([^ \ [\] \ r \\] |. \\) * \] (
?: (?: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?
: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]]) | \ [([^ \ [\] \ r \\] |. \\) * \]? (:(?
: \ r \ n)? [\ t]) *)) * \> (?: (?: \ r \ n)? [\ t]) *) | (?: [^ () <> @ ,; : \\ ". \ [\] \ 000- \ 031] + (? :(?
: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [\]])) | "(? [^ \ \ "r \\] | \\ |. (:? (: \ r \ n)?
[\ t])) * "(?: (?: \ r \ n)? [\ t]) *) *: (?: (?: \ r \ n)? [\ t]) * (?: ? (([^ () <> ',;:. \\" \ [\] 
\ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,: \\" . \ [\]])) | "(?: [^ \" \ r \\] |
\\. | (?: (?: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)? [\ t]) *) (?: \. (? : (?: \ r \ n)? [\ t]) * (?: [^ () <>

@,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ [ "() <> ',;: \\". \ [\]])) |"
(?: [^ \ "\ r \\] | \\. | (?: (?: \ r \ n)? [\ t])) *" (?: (?: \ r \ n)? [ \ t]) *)) * @ (?: (?: \ r \ n)? [\ t]
) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\
". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) * ) (?: \. (?: (?: \ r \ n)? [\ t]) * (?
: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z ?. | (= [\ [ "() <> @;: \\" \ [
\]]))) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *)) * | (?: [^ () <> @,;: \\ ". \ [\] \ 000-
\ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,;: \\". \ [ \]])) | "(: [^ \?" \ r \\] | \\ | (.
?: (?: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)? [\ t]) *) * \ <(?: (?: \ r \ n)? [\ t]) * (?: @ (?: [^ () <> @,;
: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ [" () . <> ',;: \\" \ [\]])) | \ [([
^ \ [\] \ r \\] | \\) * \] (?: (?: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ "
. \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @, ;:. \\" \ [\]])) | \ [([^ \ [\
] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *)) * (?:, @ (?: (?: \ r \ n )? [\ t]) * (?: [^ () <> @,;: \\ ". \
[\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,:: \\" \ [\]])) |. \ [([^ \ [\] \
r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]) *: [<> ', (^ (.;: \\" \ [\?)] 
\ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,: \\" . \ [\]])) | \ [([^ \ [\] \ r \\]
| \\.) * \] (?: (?: \ r \ n)? [\ t]) *)) *) *: (?: (?: \ r \ n)? [\ t]) * )? (?: [^ () <> @,;: \\ ". \ [\] \ 0
00- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ ["() <> @,: \\". \ [\]])) | "(?: [^ \" \ r \\] | \\
. | (?: (?: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)? [\ t]) *) (?: \. (? :( ?: \ r \ n)? [\ t]) * (?: [^ () <> @,
;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (? = [\ [" ( ) <> @;: "\ [\]])) |" \\ (?
: [^ \ "\ r \\] | \\. | (?: (?: \ r \ n)? [\ t])) *" (?: (?: \ r \ n)? [\ t ]) *)) * @ (?: (?: \ r \ n)? [\ t]) *
(?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\"?.
\ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: ((:: \ r \ n)? [\ t]) *) ( ?: \. (?: (?: \ r \ n)? [\ t]) * (?: [
^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | ( ? = [\ [ "() <> ',;: \\". \ [\]
])) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *)) * \> ( ?: (?: \ r \ n)? [\ t]) *) (?:, \ s * (
?: (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\
". \ [\]])) |" (?: [^ \ "\ r \\] | \\. | (?: (?: \ r \ n)? [\ t])) *" (? : (?: \ r \ n)? [\ t]) *) (?: \. (? :(
?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (? :(? :(? : \ r \ n)? [\ t]) + | \ Z | (? = [
\ [ "() <> ',;: \\". \ [\]].?)) |? "([^ \ \" R \\] | \\ | ((: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)? [\ t
]) *)) * @ (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;:: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T
]) + | \ Z | (=? [\ [ "() <> ',;: \\". \ [\]])) | \ [([^ \ [\] \ R \\] | \ \.) * \] (?: (?: \ r \ n)? [\ t]) *) (?
: \. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + ( ?: (?: (?: \ r \ n)? [\ t]) + |
\ Z | (= [\ [ "() <> ',;: \\"?. \ [\]]).) | \ [([^ \ [\] \ R \\] | \\) * \] (?: (?: \ r \ n)? [\ t]) *)) * | (?:
[^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\". \ [\
]])) | | ((?: [^ \ "\ r \\] | \\. | (?: (?: \ r \ n)? [\ t])) *" (?: (?: \ r \ n)? [\ t]) *) * \ <(?: (?: \ r \ n)
? [\ t]) * (?: @ (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["
() <> ',;.:.? "\\ \ [\]])) | \ [([^ \ [\] \ r \\] | \\) * \] ((: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)
? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <>

@;.:.? "\\ \ [\]])) | \ [([^ \ [\] \ r \\] | \\) * \] ((: \ r \ n)? [\ t]) *)) * (?:, @ (?: (?: \ r \ n)? [
 \ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ [ "() <> ',
;: \\ ". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) *) (?: \. (?: (?: \ r \ n)? [\ t]
) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\
". \ [\]])) | \ [([^ \ [\] \ r \\] | \\.) * \] (?: (?: \ r \ n)? [\ t]) * )) *) *: (?: (?: \ r \ n)? [\ t]) *)?
(?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z | (= [\ [ "() <> ',;: \\"?.
\ [\]])) | "(?: [^ \" \ r \\] | \\. | (?: (?: \ r \ n)? [\ t])) * "(? :( ?: \ r \ n)? [\ t]) *) (?: \. (? :( ?:
\ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z | (? = [\ [
"() <> ',;: \\" \ [\]])) | "([^ \?" \ R \\] | \\ | ((: \ r \ n.?). ? [\ t])) * "(?: (?: \ r \ n)? [\ t])
*)) * @ (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t])
+ | \ Z | (= [\ [ "() <> ',;: \\"? \ [\]].)) | \ [([^ \ [\] \ R \\] | \\. ) * \] (?: (?: \ r \ n)? [\ t]) *) (?: \
. (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ ". \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ Z
| (? = [\ [ "() <> ',;: \\". \ [\]]).) | \ [([^ \ [\] \ R \\] | \\) * \] (?: (?: \ r \ n)? [\ t]) *)) * \> (? :(
?: \ r \ n)? [\ t]) *)) *)?; \ s *)

738







Bu soru ├žok soruluyor, fakat bence geri ad─▒m at─▒p neden e-posta adreslerini s├Âzdizimsel olarak do─črulamak istedi─činizi sormal─▒s─▒n─▒z ? Ger├žekten faydas─▒ nedir?

  • Ortak yaz─▒m hatalar─▒ yakalamaz.
  • ─░nsanlar─▒n ge├žersiz veya tamamlanm─▒┼č e-posta adresleri girmesini veya bir ba┼čkas─▒n─▒n adresini girmesini engellemez.

Bir e-postan─▒n do─čru oldu─čunu onaylamak istiyorsan─▒z, bir onay e-postas─▒ g├Ândermekten ba┼čka bir se├žene─činiz yok ve kullan─▒c─▒n─▒n buna cevap vermesi gerekmiyor. ├ço─ču durumda , g├╝venlik nedenleriyle veya etik nedenlerden ├Ât├╝r├╝ yine de bir onay postas─▒ g├Ândermeniz gerekir (bu nedenle, ├Ârne─čin, istedikleri gibi bir servise kaydolacaks─▒n─▒z).


528







En ├žok ne demek istedi─čine ba─čl─▒: Her ge├žerli e-posta adresini yakalamaktan bahsediyorsan a┼ča─č─▒dakileri kullan:

 (?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)
 

( http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html ) Daha basit bir ┼čey ar─▒yorsan─▒z, ancak en ge├žerli e-posta adreslerini yakalayacak bir ┼čey deneyin:

 "^[a-zA-Z0-9_.+-][email protected][a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
 

EDIT: Ba─člant─▒dan:

Bu normal ifade, yaln─▒zca yorumunu alan ve bo┼čluk b─▒rak─▒lan yorumlar─▒n bulundu─ču adresleri do─črular (bu mod├╝l taraf─▒ndan yap─▒l─▒r).


334







Her ┼čey ne kadar do─čru olmak istedi─činize ba─čl─▒d─▒r. Ama├žlar─▒m i├žin, sadece bob @ aol.com (e-postalardaki bo┼čluklar) veya steve (hi├ž etki alan─▒ yok) veya [email protected] (.com'dan ├Ânce bir s├╝re yok ) gibi ┼čeyleri uzak tutmaya ├žal─▒┼čt─▒─č─▒mda , kullan─▒yorum

 /^\[email protected]\S+\.\S+$/
 

Elbette, ge├žerli bir e-posta adresi olmayan ┼čeylerle e┼čle┼čecek, ancak 90/10 kural─▒n─▒ oynama meselesi.


326







[G├ťNCELLEME] Burada e-posta adresinin do─črulanmas─▒ hakk─▒nda bildi─čim her ┼čeyi burada harmanlad─▒m: http://isemail.info , ┼čimdi yaln─▒zca do─črulayan de─čil, ayn─▒ zamanda e-posta adresleriyle ilgili sorunlar─▒ da te┼čhis ediyor. Buradaki yorumlar─▒n bir├žo─čuna, onaylaman─▒n cevab─▒n sadece bir par├žas─▒ oldu─ču konusunda hemfikirim; http://isemail.info/about adresindeki makaleme bak─▒n .

is_email (), bildi─čim kadar─▒yla, belirli bir dizgenin ge├žerli bir e-posta adresi olup olmad─▒─č─▒n─▒ kesin olarak s├Âyleyebilecek tek onaylay─▒c─▒ olarak kal─▒r. Http://isemail.info/ adresinde yeni bir s├╝r├╝m y├╝kledim

Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 ve RFC 3696'dan test vakalar─▒n─▒ harmanlad─▒m. T├╝m bu testleri, bulabildi─čim t├╝m ├╝cretsiz onaylay─▒c─▒lara kar┼č─▒ ├žal─▒┼čt─▒rd─▒m.

─░nsanlar do─črulay─▒c─▒lar─▒n─▒ geli┼čtirirken bu sayfay─▒ g├╝ncel tutmaya ├žal─▒┼čaca─č─▒m. Cal, Michael, Dave, Paul ve Phil'e, bu testleri ve kendi validat├Âr├╝m├╝n yap─▒c─▒ ele┼čtirilerini derlemedeki yard─▒mlar─▒ ve i┼čbirlikleri i├žin te┼čekk├╝r ederim .

─░nsanlar , ├Âzellikle RFC 3696'ya kar┼č─▒ olan bilgilerin fark─▒nda olmal─▒d─▒r . Kanonik ├Ârneklerin ├╝├ž├╝ asl─▒nda ge├žersiz adreslerdir. Bir adresin maksimum uzunlu─ču 320 de─čil 254 veya 256 karakterdir .


286







Ba┼č─▒na W3C HTML5 spec :

 ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$
 

Ba─člam:

Bir ge├žerli bir e-posta adresi ABNF ├╝retimini [...] e┼čle┼čen bir dizedir.

Not: Bu gereksinim, ayn─▒ anda ├žok kat─▒ (ÔÇť@ÔÇŁ karakterinden ├Ânce), ├žok belirsiz (ÔÇť@ÔÇŁ karakterinden sonra) ve ├žok gev┼ček (e-posta adresleri i├žin bir s├Âzdizimi) tan─▒mlayan kas─▒tl─▒ bir RFC 5322 ihlalidir . yorumlar─▒n, bo┼čluk karakterlerinin ve al─▒nt─▒lanan dizelerin ├žo─ču kullan─▒c─▒n─▒n bilmedi─či ┼čekillerde pratikte kullan─▒lmas─▒na izin verilmesi.

A┼ča─č─▒daki JavaScript ve Perl uyumlu normal ifade, yukar─▒daki tan─▒m─▒n bir uygulamas─▒d─▒r.

 /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
 


261







Perl 5.10 veya daha yeni s├╝r├╝mlerde kolay:

 /(?(DEFINE)
   (?<address>         (?&mailbox) | (?&group))
   (?<mailbox>         (?&name_addr) | (?&addr_spec))
   (?<name_addr>       (?&display_name)? (?&angle_addr))
   (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
   (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
                                          (?&CFWS)?)
   (?<display_name>    (?&phrase))
   (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

   (?<addr_spec>       (?&local_part) \@ (?&domain))
   (?<local_part>      (?&dot_atom) | (?&quoted_string))
   (?<domain>          (?&dot_atom) | (?&domain_literal))
   (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                 \] (?&CFWS)?)
   (?<dcontent>        (?&dtext) | (?&quoted_pair))
   (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

   (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
   (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
   (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
   (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

   (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
   (?<quoted_pair>     \\ (?&text))

   (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
   (?<qcontent>        (?&qtext) | (?&quoted_pair))
   (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                        (?&FWS)? (?&DQUOTE) (?&CFWS)?)

   (?<word>            (?&atom) | (?&quoted_string))
   (?<phrase>          (?&word)+)

   # Folding white space
   (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
   (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
   (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
   (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
   (?<CFWS>            (?: (?&FWS)? (?&comment))*
                       (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

   # No whitespace control
   (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

   (?<ALPHA>           [A-Za-z])
   (?<DIGIT>           [0-9])
   (?<CRLF>            \x0d \x0a)
   (?<DQUOTE>          ")
   (?<WSP>             [\x20\x09])
 )

 (?&address)/x
 

199







kullan─▒r─▒m

 ^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
 

ASP.NET'te RegularExpressionValidator taraf─▒ndan kullan─▒lan hangisidir.


152







En iyisi hakk─▒nda bir ┼čey bilmiyorum, ancak adresleri a├ž─▒klamalar─▒ ├ž─▒kard─▒k├ža ve bo┼člukla de─či┼čtirildi─či s├╝rece, bu en az─▒ndan do─črudur.

Ciddi anlamda. E-postalar─▒ do─črulamak i├žin ├Ânceden yaz─▒lm─▒┼č bir k├╝t├╝phane kullanmal─▒s─▒n─▒z. En iyi yol muhtemelen bu adrese bir do─črulama e-postas─▒ g├Ândermektir.


141







Do─črulamak istedi─čim e-posta adresleri, bir liste halinde e-posta g├Ândermek i├žin System.Net.Mail ad alan─▒n─▒ kullanan ASP.NET web uygulamas─▒ taraf─▒ndan kullan─▒lacakt─▒r. Bu y├╝zden, baz─▒ ├žok karma┼č─▒k d├╝zenli ifadeler kullanmak yerine, adresten bir MailAddress ├Ârne─či olu┼čturmaya ├žal─▒┼č─▒yorum. Adres do─čru ┼čekilde olu┼čturulmam─▒┼čsa, MailAddress construtor bir istisna atar. Bu ┼čekilde, en az─▒ndan e-postay─▒ kap─▒dan ├ž─▒karabilece─čimi biliyorum. Tabii ki bu sunucu taraf─▒ do─črulama ama en az─▒ndan buna ihtiyac─▒n─▒z var.

 protected void emailValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    try
    {
        var a = new MailAddress(txtEmail.Text);
    }
    catch (Exception ex)
    {
        args.IsValid = false;
        emailValidator.ErrorMessage = "email: " + ex.Message;
    }
}
 

109







H─▒zl─▒ cevap

Giri┼č do─črulama i├žin a┼ča─č─▒daki regex kullan─▒n:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

Bu regex ile e┼čle┼čen adresler:

  • RFC 5321/5322 ile tamamen uyumlu yerel bir b├Âl├╝me (yani @ i┼čaretinden ├Ânceki b├Âl├╝me) sahip olmas─▒,
  • her biri en fazla 63 karakter uzunlu─čunda olan en az iki etiketli bir ana bilgisayar ad─▒ olan etki alan─▒ b├Âl├╝m├╝ne (yani @ i┼čaretinden sonraki b├Âl├╝m) sahiptir.

─░kinci k─▒s─▒t, RFC 5321/5322'deki bir k─▒s─▒tlamad─▒r.

Ayr─▒nt─▒l─▒ cevap

E-posta adreslerini tan─▒yan normal bir ifade kullanmak ├že┼čitli durumlarda yararl─▒ olabilir: ├Ârne─čin bir belgedeki e-posta adreslerini taramak, kullan─▒c─▒ giri┼čini do─črulamak veya bir veri deposundaki b├╝t├╝nl├╝k k─▒s─▒t─▒ olarak.

Ancak, e─čer adresin ger├žekten mevcut bir posta kutusuna at─▒fta bulunup bulunmad─▒─č─▒n─▒ ├Â─črenmek istiyorsan─▒z, adrese mesaj g├Ândermenin yerini alamayaca─č─▒na dikkat edilmelidir. Yaln─▒zca bir adresin dilbilgisi bak─▒m─▒ndan do─čru olup olmad─▒─č─▒n─▒ kontrol etmek istiyorsan─▒z, normal bir ifade kullanabilirsiniz, ancak ""@[] kesinlikle mevcut bir posta kutusuna at─▒fta bulunmayan, dilbilgisi a├ž─▒s─▒ndan do─čru bir e-posta adresi oldu─čunu unutmay─▒n .

E-posta adreslerinin s├Âzdizimi , ├žo─ču RFC 822 ve RFC 5322 olmak ├╝zere ├že┼čitli RFC'lerde tan─▒mlanm─▒┼čt─▒r . RFC 822 "orijinal" standart, RFC 5322 ise en son standart olarak g├Âr├╝lmelidir. RFC 822'de tan─▒mlanan s├Âzdizimi en hafif ve sonraki standartlar, daha yeni sistemler veya hizmetlerin eski s├Âzdizimini tan─▒mas─▒, ancak onu ├╝retmemesi gereken s├Âzdizimini daha da s─▒n─▒rland─▒rm─▒┼čt─▒r.http://tools.ietf.org/html/rfc822http://tools.ietf.org/html/rfc5322

Bu cevapta addr-spec , RFC'lerde tan─▒mland─▒─č─▒ ┼čekilde (yani , ya da [email protected] de─čil ) ÔÇťe-posta adresiniÔÇŁ alaca─č─▒m . "John Doe"<[email protected]> some-group:[email protected],[email protected];

RFC s├Âzdizimlerini regex'lere ├ževirmede bir sorun var: s├Âzdizimleri normal de─čil! Bunun nedeni, sonsuz yuvalama d├╝zenli bir ifade ile tan─▒mlanamad─▒─č─▒ i├žin, s─▒n─▒rs─▒z yuvalama yapabilen e-posta adreslerinde iste─če ba─čl─▒ yorumlara izin vermeleridir. Yorumlar i├žeren adresleri taramak veya do─črulamak i├žin bir ayr─▒┼čt─▒r─▒c─▒ya veya daha g├╝├žl├╝ ifadelere ihtiyac─▒n─▒z vard─▒r. (Perl gibi dillerin ba─člams─▒z gramerleri regex benzeri bir ┼čekilde tan─▒mlamak i├žin kurgular─▒ oldu─čunu unutmay─▒n.) Bu cevapta yorumlar─▒ dikkate almayaca─č─▒m ve sadece normal ifadeleri dikkate alaca─č─▒m.

RFC'ler, e-posta adresleri i├žin s├Âzdizimlerini tan─▒mlar, e-posta adresleri i├žin de─čil. Adresler ├že┼čitli ba┼čl─▒k alanlar─▒nda g├Âr├╝nebilir ve buras─▒ ├Âncelikle tan─▒mland─▒klar─▒ yerdir. Ba┼čl─▒k alanlar─▒nda g├Âr├╝nd├╝klerinde adresler (s├Âzc├╝k belirte├žleri aras─▒nda) bo┼čluk, yorum ve hatta sat─▒r ├žizgiler i├žerebilir. Anlamsal olarak bunun bir ├Ânemi yoktur. Bu bo┼čluk, vb. Bir adresten kald─▒r─▒larak, semantik olarak e┼čde─čer bir kanonik g├Âsterim elde edilir . Bu nedenle, kanonik temsili first. last (comment) @ [3.5.7.9] olup [email protected][3.5.7.9] .

Farkl─▒ ama├žlar i├žin farkl─▒ s├Âzdizimleri kullan─▒lmal─▒d─▒r. E-posta adreslerini (muhtemelen ├žok eski) bir belgede taramak istiyorsan─▒z, RFC 822'de tan─▒mland─▒─č─▒ gibi s├Âzdizimini kullanmak iyi bir fikir olabilir. ├ľte yandan, kullan─▒c─▒ giri┼čini do─črulamak istiyorsan─▒z, RFC 5322'de tan─▒mland─▒─č─▒ gibi s├Âzdizimi, muhtemelen sadece kanonik g├Âsterimleri kabul etmek. ├ľzel durumunuz i├žin hangi s├Âzdiziminin ge├žerli oldu─čuna karar vermelisiniz.

ASCII uyumlu bir karakter k├╝mesi varsayarak POSIX "geni┼čletilmi┼č" normal ifadeler kullan─▒yorum.

RFC 822

A┼ča─č─▒daki d├╝zenli ifadeye geldim. Herkesi denemeye ve k─▒rmaya davet ediyorum. Herhangi bir yanl─▒┼č pozitif veya yanl─▒┼č negatif bulursan─▒z, l├╝tfen onlar─▒ bir yorumda yay─▒nlay─▒n; en k─▒sa s├╝rede ifadeyi d├╝zeltmeye ├žal─▒┼čaca─č─▒m.

([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*

Bunun, rapor dahil, RFC 822 ile tamamen uyumlu oldu─čuna inan─▒yorum . Yaln─▒zca e-posta adreslerini kanonik bi├žimde tan─▒r. Beyazl─▒k alan─▒n─▒ (katlayan) tan─▒yan bir regex i├žin a┼ča─č─▒daki t├╝retime bak─▒n.

T├╝retme ifadeye nas─▒l geldi─čimi g├Âsterir. ─░lgili t├╝m dilbilgisi kurallar─▒n─▒ RFC'den aynen g├Âr├╝nd├╝kleri gibi s─▒ral─▒yorum, ard─▒ndan gelen regex. Bir erratum yay─▒nland─▒─č─▒ zaman, d├╝zeltilmi┼č dilbilgisi kural─▒ i├žin ("erratum" i┼čaretli) ayr─▒ bir ifade veriyorum ve g├╝ncellenmi┼č s├╝r├╝m├╝ daha sonraki d├╝zenli ifadelerde alt ifade olarak kullan─▒yorum.

Paragraf 3.1.4'te belirtildi─či gibi. RFC 822'nin iste─če ba─čl─▒ lineer beyaz bo┼člu─ču s├Âzc├╝k belirte├žleri aras─▒na yerle┼čtirilebilir. Uygulanabilir oldu─čunda, bu kurala uymas─▒ i├žin ifadeleri geni┼člettim ve sonucu "opt-lwsp" olarak i┼čaretledim.

 CHAR        =  <any ASCII character>
            =~ .

CTL         =  <any ASCII control character and DEL>
            =~ [\x00-\x1F\x7F]

CR          =  <ASCII CR, carriage return>
            =~ \r

LF          =  <ASCII LF, linefeed>
            =~ \n

SPACE       =  <ASCII SP, space>
            =~  

HTAB        =  <ASCII HT, horizontal-tab>
            =~ \t

<">         =  <ASCII quote mark>
            =~ "

CRLF        =  CR LF
            =~ \r\n

LWSP-char   =  SPACE / HTAB
            =~ [ \t]

linear-white-space =  1*([CRLF] LWSP-char)
                   =~ ((\r\n)?[ \t])+

specials    =  "(" / ")" / "<" / ">" / "@" /  "," / ";" / ":" / "\" / <"> /  "." / "[" / "]"
            =~ [][()<>@,;:\\".]

quoted-pair =  "\" CHAR
            =~ \\.

qtext       =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
            =~ [^"\\\r]|((\r\n)?[ \t])+

dtext       =  <any CHAR excluding "[", "]", "\" & CR, & including linear-white-space>
            =~ [^][\\\r]|((\r\n)?[ \t])+

quoted-string  =  <"> *(qtext|quoted-pair) <">
               =~ "([^"\\\r]|((\r\n)?[ \t])|\\.)*"
(erratum)      =~ "(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-literal =  "[" *(dtext|quoted-pair) "]"
               =~ \[([^][\\\r]|((\r\n)?[ \t])|\\.)*]
(erratum)      =~ \[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

atom        =  1*<any CHAR except specials, SPACE and CTLs>
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+

word        =  atom / quoted-string
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-ref  =  atom

sub-domain  =  domain-ref / domain-literal
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

local-part  =  word *("." word)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*

domain      =  sub-domain *("." sub-domain)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*

addr-spec   =  local-part "@" domain
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*(\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*)*@((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(canonical) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*
 

RFC 5322

A┼ča─č─▒daki d├╝zenli ifadeye geldim. Herkesi denemeye ve k─▒rmaya davet ediyorum. Herhangi bir yanl─▒┼č pozitif veya yanl─▒┼č negatif bulursan─▒z, l├╝tfen onlar─▒ bir yorumda yay─▒nlay─▒n; en k─▒sa s├╝rede ifadeyi d├╝zeltmeye ├žal─▒┼čaca─č─▒m.

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])

Ben tamamen dahil RFC 5322 ile uyumluydu inanmak do─črular─▒n─▒ . Yaln─▒zca e-posta adreslerini kanonik bi├žimde tan─▒r. Beyazl─▒k alan─▒n─▒ (katlayan) tan─▒yan bir regex i├žin a┼ča─č─▒daki t├╝retime bak─▒n.

T├╝retme ifadeye nas─▒l geldi─čimi g├Âsterir. ─░lgili t├╝m dilbilgisi kurallar─▒n─▒ RFC'den aynen g├Âr├╝nd├╝kleri gibi s─▒ral─▒yorum, ard─▒ndan gelen regex. Anlamsal olarak ilgisiz (katlama) bo┼čluk i├žeren kurallar i├žin, bu bo┼čluk kabul etmeyen "(normalize)" i┼čaretli ayr─▒ bir regex veriyorum.

RFC'nin t├╝m "obs-" kurallar─▒n─▒ g├Ârmezden geldim. Bu, regex'lerin yaln─▒zca kesinlikle RFC 5322 uyumlu olan e-posta adresleriyle e┼čle┼čti─či anlam─▒na gelir. E─čer "eski" adreslerle e┼čle┼čmeniz gerekiyorsa ("obs-" kurallar─▒n─▒ i├žeren daha gev┼ček dilbilgisi gibi), ├Ânceki paragraftaki RFC 822 regex'lerinden birini kullanabilirsiniz.

 VCHAR           =   %x21-7E
                =~  [!-~]

ALPHA           =   %x41-5A / %x61-7A
                =~  [A-Za-z]

DIGIT           =   %x30-39
                =~  [0-9]

HTAB            =   %x09
                =~  \t

CR              =   %x0D
                =~  \r

LF              =   %x0A
                =~  \n

SP              =   %x20
                =~  

DQUOTE          =   %x22
                =~  "

CRLF            =   CR LF
                =~  \r\n

WSP             =   SP / HTAB
                =~  [\t ]

quoted-pair     =   "\" (VCHAR / WSP)
                =~  \\[\t -~]

FWS             =   ([*WSP CRLF] 1*WSP)
                =~  ([\t ]*\r\n)?[\t ]+

ctext           =   %d33-39 / %d42-91 / %d93-126
                =~  []!-'*-[^-~]

("comment" is left out in the regex)
ccontent        =   ctext / quoted-pair / comment
                =~  []!-'*-[^-~]|(\\[\t -~])

(not regular)
comment         =   "(" *([FWS] ccontent) [FWS] ")"

(is equivalent to FWS when leaving out comments)
CFWS            =   (1*([FWS] comment) [FWS]) / FWS
                =~  ([\t ]*\r\n)?[\t ]+

atext           =   ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
                =~  [-!#-'*+/-9=?A-Z^-~]

dot-atom-text   =   1*atext *("." 1*atext)
                =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

dot-atom        =   [CFWS] dot-atom-text [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

qtext           =   %d33 / %d35-91 / %d93-126
                =~  []!#-[^-~]

qcontent        =   qtext / quoted-pair
                =~  []!#-[^-~]|(\\[\t -~])

(erratum)
quoted-string   =   [CFWS] DQUOTE ((1*([FWS] qcontent) [FWS]) / FWS) DQUOTE [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  "([]!#-[^-~ \t]|(\\[\t -~]))+"

dtext           =   %d33-90 / %d94-126
                =~  [!-Z^-~]

domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  \[[\t -Z^-~]*]

local-part      =   dot-atom / quoted-string
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+"

domain          =   dot-atom / domain-literal
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*]

addr-spec       =   local-part "@" domain
                =~  ((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)
(normalized)    =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])
 

Baz─▒ kaynaklar─▒n (├Âzellikle w3c ), RFC 5322'nin yerel k─▒s─▒mda (├Ârne─čin, @ i┼čaretinden ├Ânceki k─▒s─▒m) ├žok kat─▒ oldu─čunu iddia etti─čini unutmay─▒n. Bunun nedeni "..", "a..b" ve "a." olan de─čil , posta kutusu isim olarak kullan─▒labilir iken, ge├žerli bir nokta-atomu i├žerir. RFC Ancak gelmez onlar al─▒nt─▒ edilecek olmas─▒ hari├ž, bu gibi yerel par├žalar i├žin izin verir. Bunun yerine , anlamsal olarak e┼čde─čer olan [email protected] yazmal─▒s─▒n─▒z "a..b"@example.net .

Di─čer k─▒s─▒tlamalar

SMTP ( RFC 5321'de tan─▒mland─▒─č─▒ gibi ) ayr─▒ca ge├žerli e-posta adresleri k├╝mesini (veya ger├žekte: posta kutusu adlar─▒) k─▒s─▒tlar. Bu daha kat─▒ dilbilgisi empoze etmek makul g├Âr├╝n├╝yor, b├Âylece e┼čle┼čen e-posta adresi asl─▒nda bir e-posta g├Ândermek i├žin kullan─▒labilir.

RFC 5321 temel olarak "yerel" k─▒sm─▒ (yani @ i┼čaretinden ├Ânceki k─▒s─▒m) tek ba┼č─▒na b─▒rak─▒r, fakat etki alan─▒ k─▒sm─▒nda (yani @ i┼čaretinden sonraki k─▒s─▒m) daha kat─▒d─▒r. Yaln─▒zca nokta atomlar─▒n─▒n yerine host isimlerine izin verir ve domain de─či┼čmezlerinin yerine de─či┼čmezlere adres g├Ânderir.

RFC 5321'de sunulan dilbilgisi, hem ana bilgisayar adlar─▒na hem de IP adreslerine gelince ├žok yumu┼čakt─▒r. Bu tasla─č─▒ ve RFC 1034'├╝ k─▒lavuz olarak kullanarak, s├Âz konusu kurallar─▒ "d├╝zeltme" ├Âzg├╝rl├╝─č├╝n├╝ kulland─▒m . ─░┼čte ortaya ├ž─▒kan regex.

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

Kullan─▒m durumuna ba─čl─▒ olarak regex'inizde "General-address-literal" izin vermek istemeyebilece─činizi unutmay─▒n. Ayr─▒ca, (?!IPv6:) hatal─▒ bi├žimlendirilmi┼č IPv6 adresleriyle e┼čle┼čmesini "General-address-literal" k─▒sm─▒n─▒n ├Ânlenmesi i├žin son regex'te negatif bir bak─▒┼č a├ž─▒s─▒ kulland─▒─č─▒m─▒ unutmay─▒n . Baz─▒ regex i┼člemciler negatif g├Âr├╝n├╝┼č├╝ desteklemiyor. |(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+ E─čer "General-address-literal" k─▒sm─▒n─▒n tamam─▒n─▒ ├ž─▒karmak istiyorsan─▒z , alt dizeyi regex'ten ├ž─▒kar─▒n .

─░┼čte t├╝retme:

 Let-dig         =   ALPHA / DIGIT
                =~  [0-9A-Za-z]

Ldh-str         =   *( ALPHA / DIGIT / "-" ) Let-dig
                =~  [0-9A-Za-z-]*[0-9A-Za-z]

(regex is updated to make sure sub-domains are max. 63 charactes long - RFC 1034 section 3.5)
sub-domain      =   Let-dig [Ldh-str]
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?

Domain          =   sub-domain *("." sub-domain)
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*

Snum            =   1*3DIGIT
                =~  [0-9]{1,3}

(suggested replacement for "Snum")
ip4-octet       =   DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
                =~  25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]

IPv4-address-literal    =   Snum 3("."  Snum)
                        =~  [0-9]{1,3}(\.[0-9]{1,3}){3}

(suggested replacement for "IPv4-address-literal")
ip4-address     =   ip4-octet 3("." ip4-octet)
                =~  (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement for "IPv6-hex")
ip6-h16         =   "0" / ( (%x49-57 / %x65-70 /%x97-102) 0*3(%x48-57 / %x65-70 /%x97-102) )
                =~  0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}

(not from RFC)
ls32            =   ip6-h16 ":" ip6-h16 / ip4-address
                =~  (0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement of "IPv6-addr")
ip6-address     =                                      6(ip6-h16 ":") ls32
                    /                             "::" 5(ip6-h16 ":") ls32
                    / [                 ip6-h16 ] "::" 4(ip6-h16 ":") ls32
                    / [ *1(ip6-h16 ":") ip6-h16 ] "::" 3(ip6-h16 ":") ls32
                    / [ *2(ip6-h16 ":") ip6-h16 ] "::" 2(ip6-h16 ":") ls32
                    / [ *3(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16 ":"  ls32
                    / [ *4(ip6-h16 ":") ip6-h16 ] "::"                ls32
                    / [ *5(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16
                    / [ *6(ip6-h16 ":") ip6-h16 ] "::"
                =~  (((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::

IPv6-address-literal    =   "IPv6:" ip6-address
                        =~  IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)

Standardized-tag        =   Ldh-str
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]

dcontent        =   %d33-90 / %d94-126
                =~  [!-Z^-~]

General-address-literal =   Standardized-tag ":" 1*dcontent
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+

address-literal =   "[" ( IPv4-address-literal / IPv6-address-literal / General-address-literal ) "]"
                =~  \[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)]

Mailbox         =   Local-part "@" ( Domain / address-literal )
                =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])
 

Kullan─▒c─▒ giri┼či do─črulama

Yayg─▒n bir kullan─▒m durumu, kullan─▒c─▒ giri┼či do─črulama, ├Ârne─čin bir html formunda. Bu durumda, adres de─či┼čmezlerini engellemeniz ve ana bilgisayar ad─▒nda en az iki etiket gerektirmeniz genellikle makul olur. Geli┼čtirilmi┼č RFC 5321 regex'in ├Ânceki b├Âl├╝mden temel al─▒nmas─▒ durumunda, sonu├ž ifadesi ┼č├Âyle olacakt─▒r:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

Yerel k─▒sm─▒ daha fazla k─▒s─▒tlamay─▒ tavsiye etmiyorum, ├Ârne─čin al─▒nt─▒ dizeleri ├Ânleyerek, baz─▒ ana makinelerin ne t├╝r posta kutusu adlar─▒na izin verdi─čini bilmiyoruz (gibi "a..b"@example.net veya hatta "a b"@example.net ).

Ayr─▒ca, de─či┼čmez bir ├╝st d├╝zey etki alan─▒ listesine kar┼č─▒ a├ž─▒k├ža onaylanmas─▒n─▒ ya da uzunluk k─▒s─▒tlamalar─▒ getirilmesini ├Ânermiyorum ("m├╝ze" nin nas─▒l ge├žersiz k─▒ld─▒─č─▒n─▒ unutmay─▒n [a-z]{2,4} ), ancak:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\.)*(net|org|com|info| vb... )

A├ž─▒k ├╝st d├╝zey etki alan─▒ do─črulamas─▒ yolundan ge├žmeye karar verirseniz, regex'inizi g├╝ncel tuttu─čunuzdan emin olun.

Di─čer hususlar

Yaln─▒zca etki alan─▒ b├Âl├╝m├╝ndeki ana bilgisayar adlar─▒n─▒ kabul ederken (@ i┼čaretinden sonra), yukar─▒daki regex'ler, gerekti─či gibi yaln─▒zca en ├žok 63 karakterden olu┼čan etiketleri kabul eder. Ancak, ana bilgisayar ad─▒n─▒n en fazla 253 karakter uzunlu─čunda olmas─▒ gerekir (noktalar dahil). Her ne kadar bu k─▒s─▒tlama kesin olarak hala d├╝zenli olsa da, bu kural─▒ i├žeren bir regex yapmak m├╝mk├╝n de─čildir.

Bir ba┼čka husus, ├Âzellikle giri┼č do─črulama i├žin regex'leri kullan─▒rken, kullan─▒c─▒ya geri bildirimdir. Bir kullan─▒c─▒ yanl─▒┼č bir adres girerse, basit bir "s├Âzdizimsel olarak yanl─▒┼č adres" den biraz daha fazla geri bildirim vermek iyi olur. "Vanilya" regexes ile bu m├╝mk├╝n de─čildir.

Bu iki husus, adres ayr─▒┼čt─▒r─▒larak ├ž├Âz├╝lebilir. Ana bilgisayar adlar─▒ndaki ekstra uzunluk k─▒s─▒t─▒ baz─▒ durumlarda, onu kontrol eden ve adresi her iki ifadeyle e┼čle┼čtiren fazladan bir regex kullanarak da ├ž├Âz├╝lebilir.

Bu cevaptaki regex'lerin hi├žbiri performans i├žin optimize edilmemi┼čtir. Performans bir sorunsa, se├žti─činiz regex'in optimize edilip edilemeyece─čini (ve nas─▒l) g├Ârmelisiniz.


106







─░nternette bunun bir├žok ├Ârne─či var (ve san─▒r─▒m RFC'yi tamamen do─črulayan bir tane bile var - ama bellek hizmet ederse onlarca / y├╝zlerce sat─▒r). ─░nsanlar bu t├╝r ┼čeyleri onaylamaktan ka├ž─▒n─▒rlar. Neden sadece @ ve en az bir tane oldu─čunu kontrol etmiyorsunuz. ve baz─▒ basit minimum uzunluklar─▒ kar┼č─▒lar. Sahte bir e-posta girmek ve yine de ge├žerli herhangi bir regex ile e┼čle┼čmek ├Ânemsizdir. Yanl─▒┼č pozitiflerin yanl─▒┼č negatiflerden daha iyi oldu─čunu tahmin ediyorum.


73







Hangi karakterlere izin verildi─čine karar verirken, l├╝tfen kesme ve tireli arkada┼člar─▒n─▒z─▒ unutmay─▒n. ┼×irketimin, ad─▒m─▒ ─░K sisteminden kullanarak e-posta adresimi ├╝retti─či ger├že─či ├╝zerinde hi├žbir kontrol├╝m yok. Bu, kesme soyad─▒m─▒ soyad─▒mda i├žerir. E-posta adresimin "ge├žersiz" olmas─▒ nedeniyle, bir web sitesiyle etkile┼čime girmemden ka├ž kez engellendi─čimi s├Âyleyemem.


63







Bu regex Perl'in Email :: Valid k├╝t├╝phanesinden. En do─čru olaca─č─▒na inan─▒yorum, 822 ile e┼čle┼čiyor. Ve O'Reilly kitab─▒ndaki normal ifadeye dayan─▒yor:

Jeffrey Friedl'in Normal ─░fadelerde Mastering ─░fadesinde ( http://www.ora.com/catalog/regexp/ ) ├Ârne─či kullan─▒larak olu┼čturulan normal ifade .

 $RFC822PAT = <<'EOF';
[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\
xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xf
f\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\x
ff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015
"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\
xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80
-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*
)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\
\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\
x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n
\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([
^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\
\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\
x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-
\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()
]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\
x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\04
0\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\
n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\
015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?!
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\
]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\
x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\01
5()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]
)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^
()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\0
15()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][
^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\
n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\
x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?
:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-
\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015
()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()
]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\0
40)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\
[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\
xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*
)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80
-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x
80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t
]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\
\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])
*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x
80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80
-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015(
)]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\
\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t
]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\0
15()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015
()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(
\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|
\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80
-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()
]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff
])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\
\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x
80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015
()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\
\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^
(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-
\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\
n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|
\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))
[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff
\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\x
ff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(
?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\
000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\
xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\x
ff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)
*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\x
ff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-
\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)
*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\
]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]
)[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-
\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\x
ff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(
?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80
-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<
>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:
\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]
*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)
*\)[\040\t]*)*)*>)
EOF
 

63







PHP'de yazd─▒─č─▒n─▒z gibi, e-postalar i├žin PHP yerle┼čik do─črulama ├Âzelli─čini kullanman─▒z─▒ ├Âneririm.

 filter_var($value, FILTER_VALIDATE_EMAIL)
 

5.3.6'dan daha d├╝┼č├╝k bir php s├╝r├╝m├╝ kullan─▒yorsan─▒z, l├╝tfen bu sorunun fark─▒nda olun: https://bugs.php.net/bug.php?id=53091

Bu do─črulama i┼čleminin nas─▒l ├žal─▒┼čt─▒─č─▒ hakk─▒nda daha fazla bilgi istiyorsan─▒z, buraya bak─▒n: PHP'nin filter_var FILTER_VALIDATE_EMAIL ger├žekten ├žal─▒┼č─▒yor mu?


45







Cal Henderson (Flickr) PHP'de E-posta Adreslerini Ayr─▒┼čt─▒rma adl─▒ bir makale yazd─▒ ve uygun RFC (2) 822 uyumlu E-posta Adresi ayr─▒┼čt─▒rman─▒n nas─▒l yap─▒ld─▒─č─▒n─▒ g├Âsterir. Ayr─▒ca kaynak kodunu , cc lisansl─▒ php , python ve ruby'den alabilirsiniz .http://creativecommons.org/licenses/by-sa/2.5/


43







Asla kendi normal ifademle yaratma zahmetine girmedim, ├ž├╝nk├╝ ihtimalim ba┼čka birinin daha iyi bir versiyona sahip olmas─▒. ─░ste─čime g├Âre bulmak i├žin her zaman regexlib'i kullan─▒r─▒m.


42







Ger├žekten kullan─▒┼čl─▒ olan biri yok.
Cevab─▒mdaki baz─▒ sorunlar─▒ tart─▒┼č─▒yorum . E-posta adresinin do─črulanmas─▒ i├žin bir php k├╝t├╝phanesi var m─▒? , Regexp e-posta adresinin tan─▒nmas─▒ konusunda da tart─▒┼č─▒lmaktad─▒r ?

K─▒sacas─▒, tek bir kullan─▒labilir regex'in uygun bir i┼č yapmas─▒n─▒ beklemeyin. Ve en iyi regex, bir e-postan─▒n ge├žerlili─čini de─čil, s├Âzdizimini do─črular ([email protected] do─čru, ancak muhtemelen geri d├Ânecek ...).


37







En az─▒ndan ge├žerli bir e-posta adresini reddetmeyecek olan basit bir d├╝zenli ifade bir ┼čeyi kontrol etmeyi, ard─▒ndan @ i┼čaretini ve ard─▒ndan bir periyodu ve en az 2 ┼čeyi takip etmeyi izleyecektir. Hi├žbir ┼čeyi reddetmeyecek, ancak belirtimi inceledikten sonra ge├žerli ve reddedilecek bir e-posta bulam─▒yorum.

e-posta = ~ /[email protected][^@]+\.[^@]{2,}$/


34







JQuery Validation eklentisi taraf─▒ndan kullan─▒lan─▒ kullanabilirsiniz:

 /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
 

29







Bir e-posta adresini do─črulamak i├žin en iyi d├╝zenli ifadenin en kapsaml─▒ de─čerlendirmesi i├žin l├╝tfen bu ba─člant─▒ya bak─▒n; " Normal ─░fadeleri Do─črulayan E-posta Adresini Kar┼č─▒la┼čt─▒rma "

─░┼čte referans ama├žl─▒ g├╝ncel ├╝st ifade:

 /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i
 

25







Latince olmayan (├çince, Arap├ža, Yunanca, ─░branice, Kiril vb.) Alan adlar─▒na yak─▒n gelecekte izin verilece─činden bahsetmiyorum . Bu karakterler kapsam─▒na girmesi kesinlikle de─čildir ├ž├╝nk├╝ herkes, kullan─▒lan e-posta regex de─či┼čmesi gerekiyor [a-z]/i ne de \w . Hepsi ba┼čar─▒s─▒z olacak.

Ne de olsa, e-posta adresini do─črulaman─▒n en iyi yolu, hala adresi do─črulamak i├žin s├Âz konusu adrese bir e-posta g├Ândermek . E-posta adresi, kullan─▒c─▒ kimlik do─črulamas─▒n─▒n (kay─▒t / giri┼č / vb.) Bir par├žas─▒ysa, kullan─▒c─▒ etkinle┼čtirme sistemiyle m├╝kemmel ┼čekilde birle┼čtirebilirsiniz. Yani, belirtilen e-posta adresine benzersiz bir etkinle┼čtirme anahtar─▒na sahip bir ba─člant─▒ i├žeren bir e-posta g├Ânderin ve yaln─▒zca e-postadaki ba─člant─▒y─▒ kullanarak kullan─▒c─▒ yeni olu┼čturulan hesab─▒ etkinle┼čtirdi─činde oturum a├žmas─▒na izin verin.

D├╝zenlemenin amac─▒, kullan─▒c─▒y─▒ UIÔÇÖde belirtilen e-posta adresinin do─čru bi├žimde g├Âr├╝nmedi─či konusunda h─▒zl─▒ bir ┼čekilde bilgilendirmekse, temelde a┼ča─č─▒daki d├╝zenleyiciyle e┼čle┼čip e┼čle┼čmedi─čini kontrol etmek en iyisidir:

 ^([^[email protected]]+)(\.[^[email protected]]+)*@([^[email protected]]+\.)+([^[email protected]]+)$
 

Bu kadar basit. Neden d├╝nyada ve isimde ve alanda kullan─▒lan karakterleri ├Ânemsiyorsun? Sunucunun yerine ge├žerli bir e-posta adresi girmek m├╝┼čterinin sorumlulu─čundad─▒r. M├╝┼čteri gibi s├Âzdizimsel olarak ge├žerli bir e-posta adresi girse bile [email protected] , bu yasal bir e-posta adresi oldu─čunu garanti etmez. Hi├ž kimse regex bunu kald─▒ramaz.


23







HTML5 Spec anla┼č─▒laca─č─▒ e-posta adreslerini do─črulamak i├žin basit regex:

 /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
 

Bu kas─▒tl─▒ olarak RFC 5322 ile uyumlu de─čildir .

Not: Bu gereksinim, ayn─▒ anda ├žok kat─▒ ( karakterden ├Ânce ), ├žok belirsiz ( karakterden sonra ) ve ├žok gev┼ček (yorum yap─▒lmas─▒na izin veren, bo┼čluk karakterlerine,) e-posta adresleri i├žin bir s├Âzdizimi tan─▒mlayan kas─▒tl─▒ bir RFC 5322 ihlalidir . ve burada kullan─▒lan pratik kullan─▒m i├žin bir├žok kullan─▒c─▒n─▒n bilmedi─či ┼čekillerde kordonlar. @ @

Toplam uzunluk, RFC 3696 errata 1690'a g├Âre 254 karakterle de s─▒n─▒rland─▒r─▒labilir .


19







Canl─▒ bir g├Âsteri i├žin, a┼ča─č─▒daki canavar olduk├ža iyidir ancak yine de s├Âzdizimsel olarak ge├žerli olan t├╝m e-posta adreslerini do─čru ┼čekilde tan─▒m─▒yor: i├ž i├že yorumlar─▒ d├Ârt seviyeye kadar derinlemesine tan─▒yor.

Bu bir ayr─▒┼čt─▒r─▒c─▒ i├žin bir i┼čtir, ancak bir adres s├Âzdizimsel olarak ge├žerli olsa bile, yine de teslim edilemeyebilir. Bazen "Hey, hepiniz, ee-bizi izleyin!" ─░n k├Âyl├╝ y├Ântemine ba┼čvurmal─▒s─▒n─▒z.

 // derivative of work with the following copyright and license:
// Copyright (c) 2004 Casey West.  All rights reserved.
// This module is free software; you can redistribute it and/or
// modify it under the same terms as Perl itself.

// see http://search.cpan.org/~cwest/Email-Address-1.80/

private static string gibberish = @"
(?-xism:(?:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<DQ>(?-xism:(?-xism:[
^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D])))+<DQ>(?-xism:(?-xi
sm:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xis
m:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\
s*)+|\s+)*))+)?(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?
-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<(?-xism:(?-xi
sm:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^(
)\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(
?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))
|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<
>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]
+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:
(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s
*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xi
sm:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*
<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D]
)))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-x
ism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+
)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:(
?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?
-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s
*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(
?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)
+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-x
ism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-xi
sm:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:
\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+
)*\s*\)\s*)+|\s+)*)))>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-
xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))|(?-xism:(?-x
ism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*
(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D])
)|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()
<>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s
]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism
:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\
s*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-x
ism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)
*<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D
])))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\
\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-
xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)
+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:
(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(
?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[
^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\
s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+
(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism
:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:
[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+
))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*
)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism
:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\(
(?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A
\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-
xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-x
ism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism
:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))
+)*\s*\)\s*)+|\s+)*))))(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?
>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:
\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0
D]))|)+)*\s*\)\s*))+)*\s*\)\s*)*)"
  .Replace("<DQ>", "\"")
  .Replace("\t", "")
  .Replace(" ", "")
  .Replace("\r", "")
  .Replace("\n", "");

private static Regex mailbox =
  new Regex(gibberish, RegexOptions.ExplicitCapture); 
 

15







─░┼čte kulland─▒─č─▒m PHP. Bu ├ž├Âz├╝m├╝, burada ba┼čka bir yorumcu taraf─▒ndan bildirildi─či gibi "yanl─▒┼č pozitifler yanl─▒┼č negatiflerden daha iyidir" ruhu i├žinde se├žtim ve yan─▒t s├╝renizi k─▒saltmak ve sunucu y├╝k├╝n├╝ azaltmak konusunda ... sunucu kaynaklar─▒n─▒ israf etmeye gerek yok bu en basit kullan─▒c─▒ hatas─▒n─▒ ortadan kald─▒racak normal bir ifadedir. ─░sterseniz bir test e-postas─▒ g├Ândererek her zaman bunu takip edebilirsiniz.

 function validateEmail($email) {
  return (bool) stripos($email,'@');
}
 

12







Resmi standart RFC 2822ÔÇÖye g├Âre ge├žerli e-posta

 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
 

Java'da kullanmak istiyorsan─▒z ger├žekten ├žok kolay

 import java.util.regex.*;

class regexSample 
{
   public static void main(String args[]) 
   {
      //Input the string for validation
      String email = "[email protected]";

      //Set the email pattern string
      Pattern p = Pattern.compile(" (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
              +"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")"
                     + "@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]");

      //Match the given string with the pattern
      Matcher m = p.matcher(email);

      //check whether match is found 
      boolean matchFound = m.matches();

      if (matchFound)
        System.out.println("Valid Email Id.");
      else
        System.out.println("Invalid Email Id.");
   }
}
 

12







RFC 5322 standard─▒:

Nokta-atomu yerel-k─▒sm─▒, kote edilmi┼č-yerel-k─▒sm─▒, eski (kar─▒┼č─▒k nokta-atom ve al─▒nt─▒-kordonu) yerel k─▒sm─▒, alan ad─▒ alan─▒, (IPv4, IPv6 ve IPv4-haritalanm─▒┼č IPv6 adresi) alan ad─▒ de─či┼čmez alan─▒na izin verir. ve (i├ž i├že ge├žmi┼č) CFWS.

 '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD'
 

RFC 5321 standard─▒:

Nokta atomu yerel k─▒sm─▒, al─▒nt─▒ dizisi yerel k─▒sm─▒, etki alan─▒ ad─▒ alan─▒ ve (IPv4, IPv6 ve IPv4 e┼členmi┼č IPv6 adresi) etki alan─▒ haz─▒r etki alan─▒ sa─člar.

 '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"[email protected])(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?6)){3}))\])$/iD'
 

Temel:

Nokta atomu yerel par├žas─▒ ve etki alan─▒ ad─▒ etki alan─▒na izin verir (TLD'nin 2-6 alfabetik karakterle s─▒n─▒rl─▒ oldu─ču en az iki etki alan─▒ ad─▒ etiketi gerektirir).

 "/^(?!.{255,})(?!.{65,}@)([!#-'*+\/-9=?^-~-]+)(?>\.(?1))*@(?!.*[^.]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?\.){1,126}[a-z]{2,6}$/iD"
 

11







4 karakter TLD'ye izin vermemeniz garip. Sen insanlar─▒ yasaklad─▒klar─▒n─▒ .info ve .name ve uzunluk s─▒n─▒rlamas─▒ durdurma .travel ve .museum ama evet, onlar 2 karakter TLD'leri ve 3 karakter TLD'leri daha az yayg─▒nd─▒r.

Siz de b├╝y├╝k harflere izin vermelisiniz. E-posta sistemleri, yerel b├Âl├╝m├╝ ve etki alan─▒ b├Âl├╝m├╝n├╝ normalle┼čtirir.

Etki alan─▒ b├Âl├╝m├╝n├╝n regex'inde, etki alan─▒ ad─▒ '-' ile ba┼člayamaz ve '-' ile bitemez. ├çizgi yaln─▒zca aralar─▒nda kalabilir.

PEAR kitapl─▒─č─▒n─▒ kulland─▒ysan─▒z, posta i┼člevlerini inceleyin (tam ad─▒ / kitapl─▒─č─▒ unuttum). Bir i┼člevi ├ža─č─▒rarak e-posta adresini do─črulayabilirsiniz ve e-posta adresini RFC822'deki tan─▒mlamaya g├Âre do─črular.


9







 public bool ValidateEmail(string sEmail)
{
    if (sEmail == null)
    {
        return false;
    }

    int nFirstAT = sEmail.IndexOf('@');
    int nLastAT = sEmail.LastIndexOf('@');

    if ((nFirstAT > 0) && (nLastAT == nFirstAT) && (nFirstAT < (sEmail.Length - 1)))
    {
        return (Regex.IsMatch(sEmail, @"^[a-z|0-9|A-Z]*([_][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*(([_][a-z|0-9|A-Z]+)*)[email protected][a-z][a-z|0-9|A-Z]*\.([a-z][a-z|0-9|A-Z]*(\.[a-z][a-z|0-9|A-Z]*)?)$"));
    }
    else
    {
        return false;
    }
}
 

8