E-posta ile düzenli ifade eğlenceli;

5 Cevap php

Ben PHP kullanarak geçerli e-postaları filtreleyen bir düzenli ifadeleri oluşturmak için çalışıyorum ve düzenli ifadeler anlamak ne çakışan bir sorun haline koştu. İşte ben kullanıyorum kodudur.

if (!preg_match('/^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+.[a-zA-Z]{2,4}$/', $string)) {
return $false;
}

Şimdi ben araştırdım ettik malzemelerden, bu @ önce içeriğin çoklu harfler, sayılar, alt ve dönemleri olması için izin vermelidir, sonra sonra bir süre gerektirir, sonra birden fazla harf ve sayıları izin, üst daha sonra 2-4 harf düzey etki alanı.

Ancak, şu anda en üst düzey etki bölümü olan için gereksinimi yok sayar. Örneğin @ bc açıkça geçerlidir (ve olmalıdır), ancak @ b Ayrıca ben ti o kadar olarak işaretlenmesini istediğiniz geçerli olarak geri dönüyor.

Ben "bir şey eksik değilim eminim, ama bir saat için google göz attıktan sonra ben. Herkes bu bilmece için bir cevap var olabilir ne gibi bir kayıp değilim?

EDIT: cevaplar buraya gelmesi hızı bu rekabette bu site üstün kılar. Aferin!

5 Cevap

Aksine kendi çalışırken daha, belki de makaleyi How to Find or Validate an Email Address on Regular-Expressions.info okumalısınız. Makalede ayrıca normal bir ifade kullanarak bir e-posta adresini doğrulamak için istemeyebilirsiniz nedenlerini tartışır ve yerine kendi kullanmayı düşünebilirsiniz 3 düzenli ifadeler sağlar.

Sayfasından Comparing E-mail Address Validating Regular Expressions: Kohana projeden Geert De Deckere mükemmele yakın bir birini geliştirmiştir:

/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD

Ama PHP bir buildin fonksiyonu da filter_var($email, FILTER_VALIDATE_EMAIL) ama gelişim altında gibi görünüyor. Ve bir diğer ciddi bir çözüm var: PEAR:Validate. Ben PEAR Çözüm iyi biri olduğunu düşünüyorum.

Bu gördüğüm gerçek hayata karşı spec kapalı en makul ticaret:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+
(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
@
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+
(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

Tabii ki, satır sonlarını kaldırmak zorunda, ve daha üst düzey etki alanları kullanılabilir hale gelirse güncellemek zorunda.

Normal ifadede tek bir nokta "maç any karakter" anlamına gelir. Ve bir üst düzey etki alanı (aynı zamanda mevcut olduğunda, elbette) eksik olduğunda yaptığı tam olarak budur bulunuyor.

Böylece böyle kodunuzu değiştirmeniz gerekir:

if (!preg_match('/^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/', $string)) {
    return $false;
}

Ve bu arada: a lot more characters are allowed in the local part düzenli ifade şu anda sağlar olandan.