Регулярное выражение Получить адрес электронной почты с адреса электронной почты

У меня есть адрес электронной почты, который может быть равен $email = "x@example.com"; или $email="Johnny <x@example.com>" Я хочу получить $handle = "x"; для любой версии $ email. Как это можно сделать в PHP (при условии регулярного выражения). Я не так хорошо разбираюсь в регулярном выражении.

заранее спасибо

Используйте регулярное выражение <?([^<]+?)@ Затем получите результат из $matches[1] .

Вот что он делает:

  • <? соответствует необязательной < .
  • [^<]+? делает нежелательное соответствие одного или нескольких символов, которые не являются ^ или < .
  • @ соответствует @ в адресе электронной почты.

Нежелательное совпадение делает итоговое совпадение кратчайшим, необходимым для соответствия регулярному выражению. Это предотвращает прохождение мимо @ .

Рубку: http://www.rubular.com/r/bntNa8YVZt

Вот полное решение PHP, основанное на ответе marcog

 function extract_email($email_string) { preg_match("/<?([^<]+?)@([^>]+?)>?$/", $email_string, $matches); return $matches[1] . "@" . $matches[2]; } echo extract_email("ice.cream.bob@gmail.com"); // outputs ice.cream.bob@gmail.com echo extract_email("Ice Cream Bob <ice.cream.bob@gmail.com>"); // outputs ice.cream.bob@gmail.com 

Просто найдите строку, используя это базовое регулярное выражение для входа в электронную почту: \ b [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [AZ] {2,4} \ b будет соответствовать любому письму в любом тексте, а в первой строке он будет соответствовать всей строке, а во второй – только части строки, которая является электронной почтой.

Чтобы быстро изучить regexp, это лучшее место: http://www.regular-expressions.info

 $email = 'x@gmail.com'; preg_match('/([a-zA-Z0-9\-\._\+]+@[a-z0-9A-Z\-\._]+\.[a-zA-Z]+)/', $email, $regex); $handle = array_shift(explode('@', $regex[1])); 

Попробуйте (не проверено)