在PHP中,将字符串与关键字列表匹配的最有效方法是什么?

时间:2015-06-19 19:04:35

标签: php regex string match

我有一个关键字列表,需要检查这些关键字是否出现在字符串中。 E.g:

/* Keywords */
Rock
Paper
Scissors

/* Strings */
"This town rocks!"    /* Match */
"Paper is patient"    /* Match */
"Hello, world!"       /* No match */

我可以将我的关键字放在一个数组中,循环遍历它,并在每次迭代时执行preg_match()或substr(),但这看起来有点麻烦。我已经用regexps了解了一下,但没有太大的成功。

执行此操作的最有效方法(在精简代码和低CPU负载方面)是什么?

请注意,比较必须不区分大小写。

3 个答案:

答案 0 :(得分:2)

具有所有备选方案的正则表达式将确保一次扫描字符串,而不是N个关键字的N次。 PCRE库已经过优化。

preg_match('/rock|paper|scissors/i', $string);

如果你的关键字有共同的前缀并且你利用它(主要是通过构建一个trie并内联它),它会变得更快:

preg_match('/rock|paper|sci(?:ssors|ence)/i', $string);

最后还有

preg_grep($regex, $array_of_strings);

将匹配一个字符串数组并返回匹配的字符串。

答案 1 :(得分:1)

只是为了查看是否找到任何关键字,您可以将关键字作为数组执行此操作:

if(str_ireplace($keyword_array, '', $string) != $string) {
    //match
} else {
    //no match
}

答案 2 :(得分:0)

如果您事先不知道自己的关键字,并且想要搜索多个字符串,则可以将关键字压缩到正则表达式并使用grep字符串:

$keywords = array ('Rock', 'Paper', 'sciSSors');
$strings  = array (
    "This town rocks!",
    "Hello, world!",
    "Paper is patient",
);

$rc = preg_grep(
    sprintf('/%s/i', implode('|', array_map('preg_quote', $keywords))),
    $strings
);

/**
array(2) {
  [0]=>
  string(16) "This town rocks!"
  [2]=>
  string(16) "Paper is patient"
}
*/

See it here.