我编写了一个相对简单的代码,根据特定的模式从日志文件中提取电子邮件地址;我只对人们向自己发送电子邮件的情况感兴趣。
这在日志中显示如下: <%EMAIL%> -> <%SAME-EMAIL%>
澄清:
<%EMAIL%>表示电子邮件地址,其中用“ <>”字符表示,后跟“->”,然后是相同的电子邮件地址。该模式可能(也可能不会)在一行中多次出现。
for example:
<[email protected]> -> <[email protected]> should match
<[email protected]> -> <[email protected]> should NOT match
我当前使用的代码:
$regx = '/(<[\S]+>)\s->\s\1/';
while ( !feof($myfile) )
{
$line = fgets($myfile);
$tmpline = $line;
if ( preg_match_all($regx, $tmpline, $tmp) )
{
$data[$caught++] = $tmp;
}
}
fclose($myfile);
我的问题是,$tmp
数组不只将实际地址存储在“->”子字符串中。我的输出(print_r($data)
)如下所示:
Array
(
[0] => Array
(
[0] => ->
)
[1] => Array
(
[0] =>
)
)
...
我怀疑,问题出在我的正则表达式模式上,但是不幸的是我还无法识别它。
请帮忙。
结束语:
输出始终正确,但是电子邮件在<>字符内,并且我的浏览器尝试将它们解析为HTML或XML,因此在将它们回显时它们不会出现:@
解决方案隐藏在视图源中。
这个怎么样?
$data =
preg_match_all('/<(\S+)>\s->\s<\1>/', file_get_contents($filename), $m)
? $m[1]
: array()
;
print_r($data);
使用的另一个版本fgets()
。
$data = array();
$fp = fopen($filename, 'r');
while (false !== $row = fgets($fp)) {
if (preg_match_all('/<(\S+)>\s->\s<\1>/', $row, $m)) {
foreach ($m[1] as $email) {
$data[] = $email;
}
}
}
if (!feof($fp)) {
exit('Error');
}
print_r($data);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句