2010-01-12 13 views
5

Witam Próbuję wyszukać ciąg znaków, aby sprawdzić, czy zawiera on adres e-mail, a następnie go zwrócić.Wyszukaj w PHP ciąg znaków na adres e-mail

Typowym wyrazem email vaildator jest:

eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email); 

Jednak w jaki sposób mogę szukać, jeśli jest to w ciągu, na przykład zwrócić adres e-mail w ciągu:

„Cześć mam na imię Joe , Można się z nim skontaktować pod adresem [email protected], jestem też na Twitterze. "

Jestem nieco zakłopotany, wiem, że mogę wyszukać, jeśli w ogóle istnieje z \ b wokół niego, ale jak zwrócić to, co jest znalezione.

Dzięki.

+1

To wyrażenie jest nieprawidłowe, przy okazji. –

+1

Pierwsze trafienie w "wyrażeniu regularnym adresu e-mail": http://www.regular-expressions.info/email.html –

+0

możliwy duplikat [w PHP, jak wyodrębnić wiele adresów e-mail z bloku tekstu i umieścić je do tablicy?] (http://stackoverflow.com/questions/3901070/in-php-how-do-i-extract-multiple-e-mail-adresy-z-blokowaniem-tekstu-i -put) –

Odpowiedz

4

add $ regs jako ostatni argument:

eregi("...", $email, $regs); 
+0

Działa świetnie, dzięki! – joobaal

+3

Joobool, jeśli ta odpowiedź była pomocna, zaakceptuj to. – Sampson

+0

Zauważ, że 'eregi' jest od dawna odłożone. Odpowiedź Jonathana Sampsona jest lepsza! –

9

Można użyć preg_match(), który wyprowadziłby go do tablicy do użycia.

$content = "Hi my name is Joe, I can be contacted at [email protected] I am also on Twitter."; 
preg_match("/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/i", $content, $matches); 

print $matches[0]; // [email protected] 
+1

Pamiętaj, że w tym przypadku musisz usunąć znaki^i $ od początku i końca wzorca -^oznacza dopasowanie początku łańcucha, a $ dopasuje koniec ciągu, więc nie znajdzie "dopasowania", chyba że e-mail jest ciągiem. Aby wyszukać zawierający adres e-mail, należy zmienić: "^ [_ a-z0-9 -] + (\. [_ A-z0-9 -] +) * @ [a-z0-9 -] + (\. [a-z0-9 -] +) * (\. [az] {2,3}) $ "to" [_a-z0-9 -] + (\. [_ a-z0-9 -] +) * @ [a-z0-9 -] + (\. [a-z0-9 -] +) * (\. [az] {2,3}) " – Nicole

+0

Zdecydowałem się kontynuować używanie eregi, dzięki za wskaźnik Renesis. – joobaal

+0

Och i dzięki za pomoc także Jonathan! – joobaal

0

Lepszym PCRE dla wydobywania się ADDR_SPEC jest:

/[a-z0-9\._%+!$&*=^|~#%'`?{}/\-][email protected]([a-z0-9\-]+\.){1,}([a-z]{2,6})/ 

Ale jeśli naprawdę chcesz, aby wyodrębnić RFC 2822 wtedy potrzebujesz czegoś takiego:

/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

C.