我有一个 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; }} 在正则表达式和性能方面,我不是专家。性能可能是这里的一个问题吗?
3 回答
紫衣仙女
TA贡献1839条经验 获得超15个赞
用于
stripos($user->flirttext, $word->word) !== false
更快地检查,因为不需要正则表达式。用于
preg_match('/\b(' . implode('|', array_column($susWords, 'word')) . ')\b/', $user->flirttext)
一次检查所有单词
翻阅古今
TA贡献1780条经验 获得超5个赞
如果文本中只有标点符号,这种方法并不是很好。在这种情况下根本不应该使用。留在这里作为参考
您还可以使用 array_intersect 来避免循环:
$wordlist = explode(' ', $user->flirttext));
if (count(array_intersect($susWords, $wordlist)) > 0) {
// found a bad word, do something
}
- 3 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消