У меня есть адрес электронной почты, который может быть равен $email = "x@example.com";
или $email="Johnny <x@example.com>"
Я хочу получить $handle = "x";
для любой версии $ email. Как это можно сделать в PHP (при условии регулярного выражения). Я не так хорошо разбираюсь в регулярном выражении.
заранее спасибо
Используйте регулярное выражение <?([^<]+?)@
Затем получите результат из $matches[1]
.
Вот что он делает:
<?
соответствует необязательной <
. [^<]+?
делает нежелательное соответствие одного или нескольких символов, которые не являются ^
или <
. @
соответствует @
в адресе электронной почты. Нежелательное совпадение делает итоговое совпадение кратчайшим, необходимым для соответствия регулярному выражению. Это предотвращает прохождение мимо @
.
Вот полное решение 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]));
Попробуйте (не проверено)