2009-10-27 49 views

回答

9

preg_match_all()似乎是恰當的:

$in = '"Test, User" <[email protected]>, "Another, Test" <[email protected]>, .........'; 
preg_match_all('!"(.*?)"\s+<\s*(.*?)\s*>!', $in, $matches); 
$out = array(); 
for ($i=0; $i<count($matches[0]); $i++) { 
    $out[] = array(
    'name' => $matches[1][$i], 
    'email' => $matches[2][$i], 
); 
} 
print_r($out); 

輸出:

Array 
(
    [0] => Array 
     (
      [name] => Test, User 
      [email] => [email protected] 
     ) 

    [1] => Array 
     (
      [name] => Another, Test 
      [email] => [email protected] 
     ) 

) 
+0

如果使用[^ <>]而不是。在名字裏。那麼你可以讓點(。)變得貪婪?你也可以爲這兩個點做。 – Jaskirat 2009-10-27 16:56:55

+0

什麼是「!」在正則表達式意味着什麼?就是想。 – serg 2009-10-27 16:57:19

+0

Ofcourse無論工程是好的!只是問..;) – Jaskirat 2009-10-27 16:58:38

0

你爲什麼不preg_split通過模式匹配:

"Test, User" <test[at]test.com>, 

然後preg_match找到名稱和電子郵件組件,然後p讓他們在一個陣列中。

0
$strs = preg_split($in,'".*" < .* >,'); 
foreach ($strs as $str){ 
$in1 = preg_match('/".+"/', $str); 
$in2 = preg_match('/< .+ >/', $str); 
push($out,array('name'=>$in1,'email'=>$in2); 
} 
echo $out; 
+0

不起作用。名稱中有逗號。 – cletus 2009-10-27 16:56:08

+0

right .. can not use逗號分割... – 2009-10-27 16:57:27

2

我結合這個答案與另一個這裏建立一個比較完整的解析器:

function parseEmailListToArray($list) { 
    $t = str_getcsv($list); 

    foreach($t as $k => $v) { 
     if (strpos($v,',') !== false) { 
      $t[$k] = '"'.str_replace(' <','" <',$v); 
     } 
    } 

    foreach ($t as $addr) { 
     if (strpos($addr, '<')) { 
      preg_match('!(.*?)\s?<\s*(.*?)\s*>!', $addr, $matches); 
      $emails[] = array(
       'email' => $matches[2], 
       'name' => $matches[1] 
      ); 
     } else { 
      $emails[] = array(
       'email' => $addr, 
       'name' => '' 
      ); 
     } 
    } 

    return $emails; 
} 
0

燦」還沒有評論,但工作通過克萊圖斯從荷蘭國際集團回答我擴大了正則表達式:

$regex = '/(("([^"]*)"|[^",]*)\\s*<(.*?)>|[^",\\s]+)(?=(,|$))/'; 
preg_match_all($regex,$in,$matches,PREG_SET_ORDER); 
$out = []; 
foreach($matches as $match) $out[] = [ 
    'name' => $match[3] ?: trim($match[2]), 
    'email' => trim($match[4]) ?: $match[1] 
]; 

這也將匹配一個簡單的[email protected]<[email protected]>name將是空的話),並且沒有包圍引號的名稱。

相關問題