2012-11-21 67 views
1

我需要從一個數據文件中提取名稱和電子郵件。該文件包含超過500行,我想提取這兩個信息幾乎所有的數據。我想使用preg_match_all,但我的功能不起作用...PHP:從數據文件中提取電子郵件和名稱

$chaine = 
" ----------------- 
11/21/12 16:06:54 tcp static-qvn-qvt-127041 
MAIL [email protected] 
NAME tata1 
----------------- 
11/21/12 16:06:54 tcp static-qvn-qvt-127041 
MAIL [email protected] 
NAME tata2 
* ----------------- 
11/21/12 16:06:54 tcp static-qvn-qvt-127041 
MAIL [email protected] 
NAME tata3 
"; 

//$chaine =" #76:50#89:1#86:50#49:1#84:22"; 
$motif="/MAIL([a-z]{2,4}+)NAME([a-z]{2,4}+)/"; 
preg_match_all($motif,$chaine,$out); 
$nb=count($out[0]); 
for($i=0;$i<$nb;$i++) 
{ 
    echo $out[0][$i].'<br/>'; 
} 
+1

你的正則表達式沒有正確設置。他們沒有考慮多行,並且不允許電子郵件中的'.'和'@'匹配。 –

+0

Vous etesFrançais? MDR –

+1

oui je suisfrançais:) –

回答

1

「s」修飾符添加對多行的支持。

你的正則表達式將是這個樣子:

$motif="/MAIL\s*([a-z]{2,4}).*?NAME\s*([a-z]{2,4})/s"; 
1

我覺得正則表達式可能是你正在做的事情有點矯枉過正。

爲什麼不簡單地逐行閱讀,使用空格作爲分隔符來爆炸(文檔here),然後檢查第一個項目是「MAIL」還是它是「NAME」,然後使用第二個項目,否則放棄這一行?

下面是一個例子代碼做的:

foreach(preg_split("/((\r?\n)|(\r\n?))/", $chaine) as $line) 
{ 
    $segments = explode(' ', $line); 
    if($segments[0] === "MAIL") 
     echo "Found mail " . $segments[1] . "\n"; 
    elseif($segments[0] === "NAME") 
     echo "Found name " . $segments[1] . "\n"; 
} 
相關問題