Napisałem prostą funkcję do weryfikacji adresów e-mail. Nie będę się zagłębiał w szczegóły tej funkcji, ponieważ mam problem tylko w 1 miejscu z działaniem wyrażeń regularnych. Moja funkcja dzieli podany przez użytkownika adres e-mail w miejscu znaku @ na 2 łańcuchy. Interesuje mnie zweryfikowanie tylko części lokalnej adresu, bo domenę sprawdzam przy pomocy funkcji 'checkdnsrr'. Szukałem funkcji do weryfikacji e-mail w wielu różnych miejscach, ale zazwyczaj były dla mnie niewystarczające. Moja funkcja musi sprawdzać tak - część lokalna adresu wg wytycznych nie może się zaczynać od kropki, nie może się kończyć kropką i 2 kropki lub więcej nie mogą występować jedna po drugiej. W tej części adresu mogą występować następujące znaki: ! # $ % & ' * + - / = ? ^ _ ` . { | } ~ i oczywiście a-z A-Z 0-9.
Problem polega na tym, że wywołanie funkcji 'preg_match' z moim wyrażeniem regularnym daje niespodziewane dla mnie efekty. Poniżej przedstawię fragment problematycznego kodu:
$wyrazenie = '/^[a-zA-Z0-9!#\$%&\'\*\+-]{1}[a-zA-Z0-9!#$%&\'*+-\/=?^_`\.{|}~]*$/';
if(preg_match($wyrazenie, $email_nazwa)) {
$status = true;
}
Na tą chwilę interesuje mnie tylko początek wyrażenia regularnego, która sprawdza pierwszy znak adresu e-mail. Powyższy kod działa dobrze, ale po dodaniu do niego pozostałych dopuszczalnych znaków, czyli: / = ? ^ _ ` { | } ~ (oczywiście znaki, które mają specjalne znaczenie dla parsera poprzedzam znakiem ucieczki \) wyrażenie daje dziwne rezultaty. Jeśli podam adres z kropką na początku (która przecież nie występuje w moim przedziale znaków) adres jest uznawany za prawidłowy. Nie wiem dlaczego tak się dzieje.
Poza tym, czy ma ktoś pomysł na lepsze wyrażenie regularne, które sprawdza lokalną część adresu? Nie wiem też jak napisać wyrażenie, które nie pozwoli na występowanie dwóch lub więcej kropek obok siebie. Czy wyrażenia regularne podołają w tym przypadku, czy muszę napisać swoją funkcję do sprawdzania kropek?
Z góry dziękuję za wszystkie podpowiedzi.