How do you perform a preg_match where the pattern is an array, in php?

前端 未结 7 1385
予麋鹿
予麋鹿 2020-12-16 20:41

I have an array full of patterns that I need matched. Any way to do that, other than a for() loop? Im trying to do it in the least CPU intensive way, since I will be doing

7条回答
  •  离开以前
    2020-12-16 20:57

    First of all, if you literally are only doing dozens every minute, then I wouldn't worry terribly about the performance in this case. These matches are pretty quick, and I don't think you're going to have a performance problem by iterating through your patterns array and calling preg_match separately like this:

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

    You can indeed combine all the patterns into one using the or operator like some people are suggesting, but don't just slap them together with a |. This will break badly if any of your patterns contain the or operator.

    I would recommend at least grouping your patterns using parenthesis like:

    foreach ($patterns as $pattern)
    {
      $grouped_patterns[] = "(" . $pattern . ")";
    }
    $master_pattern = implode($grouped_patterns, "|");
    

    But... I'm not really sure if this ends up being faster. Something has to loop through them, whether it's the preg_match or PHP. If I had to guess I'd guess that individual matches would be close to as fast and easier to read and maintain.

    Lastly, if performance is what you're looking for here, I think the most important thing to do is pull out the non regex matches into a simple "string contains" check. I would imagine that some of your checks must be simple string checks like looking to see if "This Site is Closed" is on the page.

    So doing this:

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

    and avoiding as many preg_match() as possible is probably going to be your best gain. strpos() is a lot faster than preg_match().

提交回复
热议问题