代码之家  ›  专栏  ›  技术社区  ›  Bruno De Barros

PHP-查找数组中的任何关键字是否存在于字符串中

php
  •  1
  • Bruno De Barros  · 技术社区  · 16 年前

    我想在数组中循环,对每个关键字执行strpos(),但是数组中有一万多个单词,这需要PHP花费一些时间,所以我想知道是否有更有效的方法来执行。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Byron Whitlock    16 年前

    根据字符串的大小,可以使用散列使其更快。

     foreach (preg_split("/\s/", $text) as $word)
     {
         $string[$word] = 1;
     }
    

     foreach ($keywords as $keyword)
     {
         if (isset($string[$keyword]))
         {
             // $keyword exists in string
         }
     }
    

    编辑 如果你的文本比你的关键词小得多,倒过来做,检查文本中每个词的关键词。如果文本很短,这可能比上面的更快。

     foreach (preg_split("/\s/", $text) as $word)
     {
        if (isset($keywords[$word]))
        {
            //might be faster if sizeof($text) < sizeof($keywords)
        }
    }
    
        2
  •  1
  •   Kevin Peno    16 年前

    假设设置了格式,并且只关心是否存在任何(而不是哪个)关键字,您可以尝试以下操作:

    $keywords = array( "dog", "cat" );
    
    // get a valid regex
    $test = "(\b".implode( "\b)|(\b", $keywords )."\b)";
    
    if( preg_match( $test, "there is a dog chasing a cat down the road" ) )
        print "keyword hit";
    
        3
  •  1
  •   Robert K    16 年前

    foreach($keywords as &$keyword) {
      $keyword = preg_quote($keyword);
    }
    
    $regex = "/(". implode('|', $keywords) .")/";
    
    return preg_match($regex, $str);
    

    如果你不想,你不必检查边界,但是如果你只是围绕着团队(团队) () 字符),则它将只匹配给定的单词。为了安全起见,您需要确保数组的所有成员都是preg_引用的。

        4
  •  0
  •   eflorico    16 年前

    我真的不知道它是否更有效,但您可以尝试将它们全部放在这样的正则表达式中: 使用preg_quote函数,您可以转义正则表达式的关键字。如果设置compiled选项,那么在多个字符串中使用它时可能会更有效。

        5
  •  0
  •   Buggabill    16 年前

    array_intersect_key 在两个数组上。但是我不确定这个的表现。。。

    推荐文章