我有文件,一个是关键字序列(~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和计数显示,一切正常。
我认为这是由于需要处理过多的数据,但我想知道是否有针对此类操作的建议。我使用的正则表达式非常复杂,我无法更改为其他内容。
想点什么?
答案 0 :(得分:2)
有两种优化选项:
/(regex1|regex2|...)/
。通常,PCRE可以比PHP执行循环更快地评估备选方案。例如:
$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