php preg_match_all() 每个单词 70 次 | API端点| 表现

我有一个 70 个单词的列表。该列表用于检查用户输入。用户输入是文本,平均有 30-100 个单词。如果我的列表中的单词之一出现在文本中,则用户文本将被删除,否则是允许的。在大多数情况下这是允许的,因此它将循环遍历所有单词。


要检查这些单词是否在我使用的用户文本中:


$susWords = SuspiciousWord::where('checked', true)->get();


$foundSusWord = false;

foreach ($susWords as $word) {

    if (preg_match_all("/" . $word->word . "/i", $user->flirttext)) {

        $foundSusWord = true;     

    break;

    }

在正则表达式和性能方面,我不是专家。性能可能是这里的一个问题吗?


守候你守候我
浏览 119回答 3
3回答

紫衣仙女

用于stripos($user->flirttext, $word->word) !== false更快地检查,因为不需要正则表达式。用于preg_match('/\b(' . implode('|', array_column($susWords, 'word')) . ')\b/', $user->flirttext)一次检查所有单词

呼啦一阵风

您可以使用strpos()https://www.php.net/manual/en/function.strpos.php比正则表达式高效得多。

翻阅古今

如果文本中只有标点符号,这种方法并不是很好。在这种情况下根本不应该使用。留在这里作为参考您还可以使用 array_intersect 来避免循环:$wordlist = explode(' ', $user->flirttext));if (count(array_intersect($susWords, $wordlist)) > 0) {    // found a bad word, do something}
打开App,查看更多内容
随时随地看视频慕课网APP