2009-12-02 4 views
0

Учитывая список писем, отформатированный:PHP Email Массив Regular Expression

"FirstName Last" <[email protected]>, "NewFirst NewLast" <[email protected]> 

Как я могу построить это в массив строк только адреса электронной почты (не нужно имен).

+1

Не используйте регулярные выражения, используйте синтаксический анализатор. – Gumbo

+0

Спасибо, ребята, вы указали мне в правильном направлении. – pws5068

ответ

3

PHP’s Mailparse extension имеет mailparse_rfc822_parse_addresses function, возможно, вы захотите попробовать. В противном случае вы должны создать собственный парсер адресов.

+1

+1 Переопределение колеса = плохо. Повторное использование колеса с использованием регулярного выражения = хуже. –

+0

+1 Я увлекся подходом регулярного выражения. Кажется, это * способ сделать это. – jensgram

+0

Или, как прочитано в комментариях этой функции, вы можете использовать этот пакет PEAR: http://pear.php.net/manual/en/package.mail.mail-rfc822.parseaddresslist.php – Arkh

1
<?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); 
?> 
+0

Что делать, если цитируемое отображаемое имя содержит запятую? – Gumbo

+0

Не будет работать так хорошо –

2

Вы можете использовать preg_match_all (docs):

preg_match_all('/<([^>]+)>/', $s, $matches); 
print_r($matches); // inspect the resulting array 

При условии, что все адреса заключены в <...> нет необходимости explode() строковое $s.


EDIT В ответ на замечания, регулярное выражение можно переписать в виде '/<([^@][email protected][^>]+)>/'. Не уверен, является ли отказоустойчивая, хотя :)


EDIT # 2 Используйте анализатор для любых нетривиальных данных (см комментарии ниже - адрес электронной почты разбора является суки). Однако некоторые ошибки можно предотвратить, удалив повторяющиеся адреса.

+1

И, конечно, это не удается на адресах электронной почты, таких как ''> "@ example.com'. Не по электронной почте отлично? Не то, чтобы это выражение не работало для каждого электронного письма на практике, * теоретически * это неправильно. +1 в любом случае. – Welbog

+0

Что делать, если цитируемое отображаемое имя содержит '<…>'? – Gumbo

+0

Ваш отказоустойчивый механизм все еще не работает в теории: '' @> "@ example.com' E-mail отстой. Тем не менее, мне нравятся усилия, которые вы вкладываете в это. Вы не можете отлично разбирать электронную почту с регулярным выражением. По крайней мере, не очень простой. Я верю, что вокруг есть несколько сотен символов, которые выполняют эту работу. http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html Оказывается, это несколько * тысяч * символов. – Welbog