我有一个充满模式的数组,我需要匹配.除了for()循环之外,还有什么办法吗?我试图以最少cpu密集的方式做到这一点,因为我将每分钟做几十个.
现实世界的例子是,我正在建立一个链接状态检查器,它将检查各个在线视频网站的链接,以确保视频仍然有效.每个域都有几个“死关键字”,如果在页面的html中找到它们,则表示该文件已被删除.它们存储在数组中.我需要匹配数组的内容,与页面的html输出相匹配.
首先,如果你每分钟只做几十次,那么在这种情况下我不会非常担心性能.这些匹配非常快,我不认为你会通过遍历模式数组并单独调用preg_match来解决性能问题,如下所示:
$matches = false; foreach ($pattern_array as $pattern) { if (preg_match($pattern,$page)) { $matches = true; } }
您确实可以像使用某些人建议的那样使用或运算符将所有模式组合成一个模式,但不要只是将它们与|一起打击.如果您的任何模式包含or运算符,这将严重破坏.
我建议至少使用括号分组你的模式,如:
foreach ($patterns as $pattern) { $grouped_patterns[] = "(" . $pattern . ")"; } $master_pattern = implode($grouped_patterns,"|");
但是……我不确定这最终是否会更快.无论是preg_match还是PHP,都必须循环它们.如果我不得不猜测我猜单个匹配将接近快速且更容易阅读和维护.
最后,如果你正在寻找性能,我认为最重要的是将非正则表达式匹配转换为简单的“字符串包含”检查.我想你的一些支票必须是简单的字符串检查,比如查看页面上是否有“此网站已关闭”.
这样做:
foreach ($strings_to_match as $string_to_match) { if (strpos($page,$string_to_match) !== false)) { // etc. break; } } foreach ($pattern_array as $pattern) { if (preg_match($pattern,$page)) { // etc. break; } }
避免尽可能多的preg_match()可能是你最好的收获. strpos()比preg_match()快很多.