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

标签 php regex string match

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

/* Keywords */
Rock
Paper
Scissors

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

我可以将我的关键字放在一个数组中,遍历它并在每次迭代时执行 preg_match() 或 substr(),但这似乎有点占用 CPU。我已经用正则表达式搞砸了一点,但没有太大的成功。

执行此操作的最有效方法是什么(就精益代码和低 CPU 负载而言)?

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

最佳答案

具有所有替代项的正则表达式将确保字符串被扫描一次,而不是 N 个关键字被扫描 N 次。 PCRE 库经过了很好的优化。

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

如果您的关键字具有公共(public)前缀并且您可以利用它(主要是通过构建一个 trie 并将其内联),它会变得更快:

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

终于有了

preg_grep($regex, $array_of_strings);

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

关于php - 在 PHP 中,将字符串与关键字列表进行匹配的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945523/

相关文章:

php - 来自另一个函数的数组中的引用检测

html - 解析 HTML 文本时的正则表达式与 XPath

regex - 在 find 命令中转义哪些字符

java - 将两个值作为字符串传递给同一 Activity 会返回一个值 null

java - String 与 Stringbuffer 作为 HashMap 键

php - Beautiful Soup [Python] 和表格中文本的提取

php - Api-Platform 上的 Data Persister 之后叫什么?

javascript - 在 PHP 和 JavaScript 中保存动态添加的行

Python 正则表达式不提取值 - Python 3.x

java - 如何删除特定字符后的字符?