【问题标题】:PHP regex match in file content文件内容中的 PHP 正则表达式匹配
【发布时间】:2013-06-12 20:48:33
【问题描述】:

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

<?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 中给出

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

【问题讨论】:

  • PHP.net file manual array file ( string $filename [, int $flags = 0 [, resource $context ]] ) 返回数组。由于期望参数 2 为字符串,这是不对的。
  • 错误信息告诉你到底哪里出了问题。你没看吗?

标签: php preg-match-all


【解决方案1】:

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

?>

【讨论】:

  • 谢谢,我已经从@Basje 之前的评论中理解了这一点。但现在我仍然得到一个空数组,所以我猜正则表达式匹配出了点问题......这是文件中一行的示例:192.168.1.4 - - [11/Jun/2013:06: 25:40 +0300] "GET mysite.com/… HTTP/1.1" 200 6066 "-" "-"
  • 文件似乎不包含与正则表达式匹配的数据。或者尝试逐行评估文件:$file = file($file); foreach($file as $row) { preg_match_all($regexp, $row, $keys, PREG_PATTERN_ORDER); $allkey = array_merge($allkey, $keys); }
  • 确实如此,只是当我添加带有行示例的注释时,它会将其解析为超链接,如果您将鼠标悬停在“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/1.1" 200 6242 "-" "-"
  • 好吧,那么正则表达式不应包含开始^ 和结束$ 符号:/[A-Z1-9]{5}(-[A-Z1-9]{5}){4}/。尝试使用逐行解析。
  • 是的,但它会给我带来整条线,对吧?我只需要提取的密钥,而不是整行。另一个更正,我刚刚注意到在这种情况下,密钥不包含任何数字,只有字母,所以正则表达式应该是 /[A-Z]{5}(-[A-Z]{5}){4}/ 虽然这并没有解决我的问题...... :-( 编辑: "^" 和 "$" 抑制没有帮助,仍然没有结果
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多