当前位置:  开发笔记 > 编程语言 > 正文

如何在php中执行模式为数组的preg_match?

如何解决《如何在php中执行模式为数组的preg_match?》经验,为你挑选了2个好方法。

我有一个充满模式的数组,我需要匹配.除了for()循环之外,还有什么办法吗?我试图以最少CPU密集的方式做到这一点,因为我将每分钟做几十个.

现实世界的例子是,我正在建立一个链接状态检查器,它将检查各个在线视频网站的链接,以确保视频仍然有效.每个域都有几个"死关键字",如果在页面的html中找到它们,则表示该文件已被删除.它们存储在数组中.我需要匹配数组的内容,与页面的html输出相匹配.



1> danieltalsky..:

首先,如果你每分钟只做几十次,那么在这种情况下我不会非常担心性能.这些匹配非常快,我不认为你会通过遍历模式数组并单独调用preg_match来解决性能问题,如下所示:

$matches = false;
foreach ($pattern_array as $pattern)
{
  if (preg_match($pattern, $page))
  {
    $matches = true;
  } 
}

您确实可以or像使用某些人建议的那样使用运算符将所有模式组合成一个模式,但不要只是将它们与a一起拍打|.如果您的任何模式包含 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().


为了Google员工,一旦找到匹配项,请考虑使用break(http://www.php.net/manual/en/control-structures.break.php)打破foreach循环!
我相信这应该是:foreach($ pattern_array as $ pattern),至少在我的PHP版本中

2> TravisO..:
// assuming you have something like this
$patterns = array('a','b','\w');

// converts the array into a regex friendly or list
$patterns_flattened = implode('|', $patterns);

if ( preg_match('/'. $patterns_flattened .'/', $string, $matches) )
{
}

// PS: that's off the top of my head, I didn't check it in a code editor

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有