Я хочу извлечь адрес электронной почты из строки, например:
<?php // code
$string = 'Ruchika <[email protected]>';
?>
Из приведенной выше строки я хочу получить только адрес электронной почты [email protected]
,
Просьба порекомендовать, как этого добиться.
Попробуй это
<?php
$string = 'Ruchika < [email protected] >';
$pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,4})(?:\.[a-z]{2})?/i';
preg_match_all($pattern, $string, $matches);
var_dump($matches[0]);
?>
увидеть демо здесь
Второй метод
<?php
$text = 'Ruchika < [email protected] >';
preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $text, $matches);
print_r($matches[0]);
?>
Увидеть демо здесь
Парсинг адресов электронной почты — безумная работа, которая может привести к очень сложному регулярному выражению. Например, рассмотрим это официальное регулярное выражение, чтобы поймать адрес электронной почты: http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
Удивительно верно?
Вместо этого есть стандартная функция php, которая называется mailparse_rfc822_parse_addresses()
и задокументировано Вот.
Он принимает строку в качестве аргумента и возвращает массив ассоциативного массива с ключами display, address и is_group.
Так,
$to = 'Wez Furlong <[email protected]>, [email protected]';
var_dump(mailparse_rfc822_parse_addresses($to));
даст:
array(2) {
[0]=>
array(3) {
["display"]=>
string(11) "Wez Furlong"["address"]=>
string(15) "[email protected]"["is_group"]=>
bool(false)
}
[1]=>
array(3) {
["display"]=>
string(15) "[email protected]"["address"]=>
string(15) "[email protected]"["is_group"]=>
bool(false)
}
}
Это основано на ответе Ниранджана, при условии, что у вас есть входящий адрес электронной почты, заключенный в < и> персонажи). Вместо использования регулярного выражения для получения адреса электронной почты, здесь я получаю текстовую часть между < и> персонажи. В противном случае я использую строку, чтобы получить всю электронную почту. Конечно, я не проверял адрес электронной почты, это будет зависеть от вашего сценария.
<?php
$string = 'Ruchika <[email protected]>';
$pattern = '/<(.*?)>/i';
preg_match_all($pattern, $string, $matches);
var_dump($matches);
$email = $matches[1][0] ?? $string;
echo $email;
?>
Вот раздвоенный демо.
Конечно, если мое предположение неверно, то такой подход не удастся. Но, исходя из вашего вклада, я считаю, что вы хотели извлечь письма, вложенные в < и> символы.
попробуйте этот код.
<?php
function extract_emails_from($string){
preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $string, $matches);
return $matches[0];
}
$text = "blah blah blah blah blah blah [email protected]";
$emails = extract_emails_from($text);
print(implode("\n", $emails));
?>
Это будет работать
Благодарю.
Вы также можете попробовать:
email=re.findall(r'\S+@\S+','[email protected]')
print email
где \S
означает любой не пробельный символ
Нашел несколько полезных коды как ниже,
<?php
// input: My Test Email <[email protected]>
function get_displayname_from_rfc_email($rfc_email_string) {
// match all words and whitespace, will be terminated by '<'
$name = preg_match('/[\w\s]+/', $rfc_email_string, $matches);
$matches[0] = trim($matches[0]);
return $matches[0];
}
// Output: My Test Email
function get_email_from_rfc_email($rfc_email_string) {
// extract parts between the two parentheses
$mailAddress = preg_match('/(?:<)(.+)(?:>)$/', $rfc_email_string, $matches);
return $matches[1];
}
// Output: [email protected]
?>
Надеюсь, это кому-нибудь поможет.
использовать (мою) функцию getEmailArrayFromString
легко извлечь адреса электронной почты из заданной строки.
<?php
function getEmailArrayFromString($sString = '')
{
$sPattern = '/[\._\p{L}\p{M}\p{N}-]+@[\._\p{L}\p{M}\p{N}-]+/u';
preg_match_all($sPattern, $sString, $aMatch);
$aMatch = array_keys(array_flip(current($aMatch)));
return $aMatch;
}
// Example
$sString = '[email protected] XXX [email protected] XXX <[email protected]>';
$aEmail = getEmailArrayFromString($sString);
/**
* array(3) {
[0]=>
string(15) "[email protected]"[1]=>
string(15) "[email protected]"[2]=>
string(15) "[email protected]"}
*/
var_dump($aEmail);