2

我根据他们的“年龄”(最近两天)收集了一些文件,现在我需要按照正则表达式模式从它们中提取文本(在这种情况下,模式就像微软产品密钥),这就是到目前为止我已经完成了:

<?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 是字符串,数组在 /var/www/log/keys.php 第 11 行给出

我究竟做错了什么?另外,我想知道是否可以唯一地保存那些匹配的文本字符串,这意味着如果一个键出现两次,我只需要将它保存一次到数组中。提前致谢

4

1 回答 1

3

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);

?>
于 2013-06-12T11:42:32.400 回答