Учитывая список писем, отформатированный:PHP Email Массив Regular Expression
"FirstName Last" <[email protected]>, "NewFirst NewLast" <[email protected]>
Как я могу построить это в массив строк только адреса электронной почты (не нужно имен).
Учитывая список писем, отформатированный:PHP Email Массив Regular Expression
"FirstName Last" <[email protected]>, "NewFirst NewLast" <[email protected]>
Как я могу построить это в массив строк только адреса электронной почты (не нужно имен).
PHP’s Mailparse extension имеет mailparse_rfc822_parse_addresses
function, возможно, вы захотите попробовать. В противном случае вы должны создать собственный парсер адресов.
+1 Переопределение колеса = плохо. Повторное использование колеса с использованием регулярного выражения = хуже. –
+1 Я увлекся подходом регулярного выражения. Кажется, это * способ сделать это. – jensgram
Или, как прочитано в комментариях этой функции, вы можете использовать этот пакет PEAR: http://pear.php.net/manual/en/package.mail.mail-rfc822.parseaddresslist.php – Arkh
<?php
$s = "\"FirstName Last\" <[email protected]>, \"NewFirst NewLast\" <[email protected]>";
$emails = array();
foreach (split(",", $s) as $full)
{
preg_match("/.*<([^>]+)/", $full, $email);
$emails[] = $email[1];
}
print_r($emails);
?>
Что делать, если цитируемое отображаемое имя содержит запятую? – Gumbo
Не будет работать так хорошо –
Вы можете использовать preg_match_all
(docs):
preg_match_all('/<([^>]+)>/', $s, $matches);
print_r($matches); // inspect the resulting array
При условии, что все адреса заключены в <...>
нет необходимости explode()
строковое $s
.
EDIT В ответ на замечания, регулярное выражение можно переписать в виде '/<([^@][email protected][^>]+)>/'
. Не уверен, является ли отказоустойчивая, хотя :)
EDIT # 2 Используйте анализатор для любых нетривиальных данных (см комментарии ниже - адрес электронной почты разбора является суки). Однако некоторые ошибки можно предотвратить, удалив повторяющиеся адреса.
И, конечно, это не удается на адресах электронной почты, таких как ''> "@ example.com'. Не по электронной почте отлично? Не то, чтобы это выражение не работало для каждого электронного письма на практике, * теоретически * это неправильно. +1 в любом случае. – Welbog
Что делать, если цитируемое отображаемое имя содержит '<…>'? – Gumbo
Ваш отказоустойчивый механизм все еще не работает в теории: '' @> "@ example.com' E-mail отстой. Тем не менее, мне нравятся усилия, которые вы вкладываете в это. Вы не можете отлично разбирать электронную почту с регулярным выражением. По крайней мере, не очень простой. Я верю, что вокруг есть несколько сотен символов, которые выполняют эту работу. http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html Оказывается, это несколько * тысяч * символов. – Welbog
Не используйте регулярные выражения, используйте синтаксический анализатор. – Gumbo
Спасибо, ребята, вы указали мне в правильном направлении. – pws5068