[英]PHP split emails string with commas in names sometimes
我有一些舊的舊數據,其中包含類似字符串的電子郵件地址:
$str = 'Joe Bloggs <joe@bloggs.co.uk>, Person, Test [test@person.com], me@email.com'
我想將此字符串拆分為包含在其中的3封電子郵件,但是您可以看到其中一些名稱中帶有逗號分隔符,而某些電子郵件開頭沒有RFC規范名稱。 理想情況下,上面的字符串將被拆分為以下數組:
Array (
[0] => Array(
'name' => 'Joe Blogs',
'email' => 'joe@bloggs.co.uk'
)
[1] => Array(
'name' => 'Person, Test',
'email' => 'test@person.com'
),
[2] => Array(
'name' => '',
'email' => 'me@email.com'
)
)
我猜正則表達式可以在這里工作嗎? 我提出了以下內容,但它僅處理一個電子郵件地址,而不處理逗號分隔的列表(名稱中也帶有逗號!):
preg_match_all('!(.*?)\s?[<|\[]\s*(.*?)\s*[>|\]]!',$string,$matches);
謝謝!
您可以使用
(?:,\s*)?(.*?)\s*(?|<([^>]*)>|\[([^][]*)]|(\S+@\S+))
細節
(?:,\\s*)?
-的可選序列,
然后是0+個空格 (.*?)
-組1(名稱):除換行符以外的任何0+個字符應盡可能少 \\s*
-0+空格 (?|<([^>]*)>|\\[([^][]*)]|(\\S+@\\S+))
-分支重置組匹配
<([^>]*)>|
- <
,則在組1中捕獲了除>
之外的任何0+字符,並且>
剛剛匹配 \\[([^][]*)]|
- [
,則在組1中捕獲了除]
以外的任何0+個字符,而]
僅匹配 (\\S+@\\S+)
-組1中捕獲了1個或多個非空白字符@
,再加上1+個非空白字符。 然后使用以下PHP代碼獲得必要的結果:
$re = '/(?:,\s*)?(.*?)\s*(?|<([^>]*)>|\[([^][]*)]|(\S+@\S+))/';
$str = 'Joe Bloggs <joe@bloggs.co.uk>, Person, Test [test@person.com], me@email.com';
preg_match_all($re, $str, $m, PREG_SET_ORDER, 0);
$res = array();
foreach ($m as $e)
{
$res[] = array('name' => $e[1], 'address' => $e[2]);
}
print_r($res);
輸出:
Array
(
[0] => Array
(
[name] => Joe Bloggs
[address] => joe@bloggs.co.uk
)
[1] => Array
(
[name] => Person, Test
[address] => test@person.com
)
[2] => Array
(
[name] =>
[address] => me@email.com
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.