2012-04-17 3 views
0

Я получаю контент, такой как:Regex для extracing несколько адресов электронной почты в PHP

"Jane Doe" <[email protected]>, "John Doe" <[email protected]> 

И я хотел бы, чтобы извлечь адреса электронной почты:

[email protected], [email protected] 

В настоящее время у меня есть регулярное выражение, как это :

/<(.*)>/ 

который получает все, что в скобках, но он также получает такие вещи, как:

[email protected]>, "John Doe" <[email protected] 

Когда я использовал знак @ в середине, он тоже работать не совсем верно:

/<(.*)@(.*)>/ 

я мог explode() на основе запятой, но я думаю, там должно быть путь для preg_match(), чтобы дать мне то, что я хочу. Что мне не хватает в моем регулярном выражении?

ответ

3

Ваш regexp is too greedy. Используйте /<(.*?)>/ вместо этого, или даже лучше, что-то вроде

/<([^<>][email protected][^<>]+)>/ 
+0

+1 для обозначения «жадности» – Wiseguy

1

Самый простой способ, чтобы соответствовать все, за исключением последнего разделителя:

/<([^>]*)>/ 
0

Вы в том числе слишком много с точки. Попробуйте следующее:

/<([^>]*)>/ 
3

Я использую это для согласования электронной почты, я знаю, что есть другие выражения там в дикой природе, которые могут поймать больше адреса электронной почты, но я считаю, это один быстро набрать и так далеко устраивает все мои потребности, не стесняйтесь, чтобы дать ему попробовать:

/\w+[\.\w][email protected]\w+[\.\w]+/ 

Вы можете использовать это с preg_match_all, чтобы захватить все адреса

, например:

$string = '"Jane Doe" <[email protected]>, "John Doe" <[email protected]>'; 
preg_match_all('/\w+[\.\w][email protected]\w+[\.\w]+/', $string, $matches); 
print_r($matches); 
+0

+1 для упоминания 'preg_match_all()' – Wiseguy