我有一个关键字列表,需要检查这些关键字是否出现在字符串中。 E.g:
/* Keywords */
Rock
Paper
Scissors
/* Strings */
"This town rocks!" /* Match */
"Paper is patient" /* Match */
"Hello, world!" /* No match */
我可以将我的关键字放在一个数组中,循环遍历它,并在每次迭代时执行preg_match()或substr(),但这看起来有点麻烦。我已经用regexps了解了一下,但没有太大的成功。
执行此操作的最有效方法(在精简代码和低CPU负载方面)是什么?
请注意,比较必须不区分大小写。
答案 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"
}
*/