foreach和preg_match对大量数据不能正常工作

时间:2010-12-20 10:50:54

标签: php regex foreach preg-match

我有文件,一个是关键字序列(~20k行),另一个是正则表达式(~2.5k)。

我想用每个regexp测试每个关键字并打印匹配的关键字。我测试了我的文件,大约有22 750 000个测试。我使用以下代码:

$count = 0;
$countM = 0;
foreach ($arrayRegexp as $r) {
    foreach ($arrayKeywords as $k) {
        $count++;
        if (preg_match($r, $k, $match) {
            $countM++;
            echo $k.' matched with keywords '.$match[1].'<br/>';
        }
    }
}
echo "$count tests with $countM matches.";

不幸的是,经过一段时间的计算后,只显示了实际匹配的部分内容,并且始终显示保持计数的最后一行。更奇怪的是,如果我评论preg部分只保留两个foreach和计数显示,一切正常。

我认为这是由于需要处理过多的数据,但我想知道是否有针对此类操作的建议。我使用的正则表达式非常复杂,我无法更改为其他内容。

想点什么?

2 个答案:

答案 0 :(得分:2)

有两种优化选项:

  • 正则表达式通常可以组合成替代/(regex1|regex2|...)/。通常,PCRE可以比PHP执行循环更快地评估备选方案。
  • 我不确定这是否更快(修改主题),但你可以直接使用关键字数组作为preg_replace_callback()的参数,从而消除第二个循环。

例如:

 $rx = implode("|", $arrayRegexp);  // if it hasn't /regexp/ enclosures

 preg_replace_callback("#($rx)#", "print", $arrayKeywords);

但定义一个自定义打印功能来输出和计算结果,让它只返回例如一个空字符串。

想想看,preg_replace_callback也会采用一系列正则表达式。不确定它是否交叉检查每个字符串上的每个正则表达式。

答案 1 :(得分:-1)

增加执行时间

在.htaccess中使用此行

php_value max_execution_time 80000