2013-06-12 73 views
2

我有我根据自己的“年龄”(最后两天)聚集了几个文件,我现在需要遵循正规表达式模式(在这种情况下,从中提取文字,图案是像微软的产品密钥),这是我到目前为止已经完成:PHP正则表达式匹配

<?php 

$files = iterator_to_array(
    new GlobIterator('/var/www/log/access.log.*', GlobIterator::CURRENT_AS_PATHNAME)); 

foreach ($files as $file) { 
     $filelastmodified = filemtime($file); 
       if((time()-$filelastmodified) < 48*3600 && is_file($file)) 
       { 
       $regexp = '/^[A-Z1-9]{5}(-[A-Z1-9]{5}){4}$/'; 
       preg_match_all($regexp, file($file), $keys, PREG_PATTERN_ORDER); 
       } 

} 
print_r($keys, true); 

?> 

但我发现了一个错误:

PHP Warning: preg_match_all() expects parameter 2 to be string, array given in /var/www/log/keys.php on line 11

我在做什么错? 此外,我想知道是否有可能保存唯一匹配的文本字符串,这意味着如果一个键出现两次,我只需要它一次保存到数组中。 在此先感谢

+0

[PHP.net文件手册](http://php.net/manual/en/function.file.php)'数组文件(字符串$ filename [,int $ flags = 0 [,resource $ context]])'返回数组。由于**期望参数2是字符串**,这是不正确的。 – xdbas

+0

错误消息告诉你到底发生了什么问题。你没看过吗? – Sylverdrag

回答

2

file()函数返回一个数组,请尝试file_get_contents($file)来代替。然后你可以使用array_unique()删除重复的条目:

preg_match_all($regexp, file_get_contents($file), $keys, PREG_PATTERN_ORDER); 
$keys = array_unique($keys); 

编辑:

使用另一个变量来收集数组值,那么你可以很容易地删除重复。完整的代码:

<?php 

$files = iterator_to_array(
     new GlobIterator('/var/www/log/access.log.*', GlobIterator::CURRENT_AS_PATHNAME)); 

$allkey = Array(); 
foreach ($files as $file) { 
     $filelastmodified = filemtime($file); 
     if((time()-$filelastmodified) < 48*3600 && is_file($file)) 
     { 
       $regexp = '/([A-Z]{5}(-[A-Z]{5}){4})/'; 
       preg_match_all($regexp, file_get_contents($file), $keys, PREG_PATTERN_ORDER); 
       $allkey = array_merge($allkey, $keys[1]); 
     } 
} 
$allkey = array_unique($allkey); 
print_r($allkey); 

?> 
+0

谢谢,我已经从@Basje先前的评论中了解到这一点。 但现在我仍然得到一个空数组,所以我想有些事情是会拧上的正则表达式匹配... 下面是对文件中的行的一个示例: ** 192.168.1.4 - - [11月/ 6/2013: 6时25分四十零秒0300] “GET http://mysite.com/update.php?gse=SRINO-ZKPGV-PSHJO-KXCOJ-BNKBP&gsm=d2bc6b3572d8fc2cc7cf983c9069ab2e HTTP/1.1” 200 6066 “ - ” “ - ” ** – TuxSax

+0

看起来该文件不包含与正则表达式匹配的数据。或者尝试逐行评估文件:'$ file = file($ file); foreach($ file为$ row){preg_match_all($ regexp,$ row,$ keys,PREG_PATTERN_ORDER); $ allkey = array_merge($ allkey,$ keys); }' – Stocki

+0

它的确如此,当我在线样本中添加注释时,它将其解析为超链接,如果您将鼠标悬停在“mysite.com/”上,您将看到剩下的部分,这里是没有域的行名称: ** 192.168.1.4 - - [11/Jun/2013:06:25:39 +0300]“GET domainnamehere/update.php?gse = JHSSM-QAYLT-JNKJM-ESFOH-RNMKS&gsm = 0e84c8552f630ede6e82673eb4123b8b HTTP/200 6242“ - ”“ - ”** – TuxSax