我根据他们的“年龄”(最近两天)收集了一些文件,我现在需要按照正则表达式模式从中提取文本(在这种情况下,模式就像微软产品密钥) ,这就是我到目前为止所做的:
<?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警告:preg_match_all()期望参数2为字符串,数组 在第11行的/var/www/log/keys.php中给出
我做错了什么? 另外,我想知道是否可以唯一地保存匹配的文本字符串,这意味着如果一个键出现两次我只需要将它保存一次到数组中。 提前致谢
答案 0 :(得分: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);
?>