2012-11-21 69 views
1

與可選的報價和電子郵件地址名稱拆分我有以下字符串:正則表達式,如何在PHP

「約翰尼測試」 <[email protected]>,傑克 <另一個@測試。 COM >,「斯科特 的夏天」 <[email protected]> ...

多字名是雙引號括起來

我需要包含以下結果的數組:

array( 
    array('nom' => 'Johnny Test', 'adresse' => '[email protected]'), 
    array('nom' => 'Jack', 'adresse' => '[email protected]'),  
    array('nom' => 'Scott Summers', 'adresse' => '[email protected]') 
    ... 
    ) 

回答

0
preg_match_all('/(.*?)\s<(.*?)>,?/', $string, $hits); 
print_r($hits); 

這樣的事情應該工作。

與正則表達式解析它之前,如果你有\r\n的字符串中使用:

$chars=array("\r\n", "\n", "\r"); 
$string=str_replace($chars, '', $string); 

UPDATE:代碼我用來測試這個。

test_preg2.php:

<?php 
$html='"Johnny Test" <[email protected]>,Jack <[email protected]>,"Scott Summers" <[email protected]>'; 
$chars=array("\r\n", "\n", "\r"); 
$html=str_replace($chars, '', $html); 
preg_match_all('/(.*?)\s<(.*?)>,?/', $html,$hits); 
print_r($hits); 
?> 

輸出:

Array ([0] => Array ([0] => "Johnny Test" , [1] => Jack , [2] => "Scott Summers") [1] => Array ([0] => "Johnny Test" [1] => Jack [2] => "Scott Summers") [2] => Array ([0] => [email protected] [1] => [email protected] [2] => [email protected])) 

更新2:字符串已經被格式化與ヶ輛()。 (問題的樣本串錯了人......)

preg_match_all('/(.*?)\s&lt;(.*?)&gt;,?/', $string, $hits); 
print_r($hits); 
+0

這不起作用。 preg_match_all正在返回空白匹配 – user1841557

+0

你確定嗎?我只是試了一下,它確實有效,剩下的唯一要做的就是'$ name = str_replace(''','',$ name);'刪除引號 – Naryl

+0

這不起作用preg_match_all正在返回空白匹配: 我將使用我正在使用的確切代碼更新我的答案。 – user1841557

0
$all = array(); 
$data = '"Johnny Test" <[email protected]>,Jack <[email protected]>,"Scott Summers" <[email protected]>'; 
$emails = explode(',', $data); 
foreach ($emails as $email) 
{ 
    if (preg_match('/(.*) <(.*)>/', $email, $regs)) { 
     $all[] = array(
      'nom'  => trim($regs[1], '"'), 
      'adresse' => $regs[2], 
     ); 
    } 
} 

print_r($all); 
相關問題