簡體   English   中英

PHP有時會用名稱分隔逗號分隔的電子郵件字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM