2012-11-21 70 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"; 
} 
相关问题