为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
守候你守候我 2023-10-21 16:27:00
我有一个 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个赞

  1. 用于stripos($user->flirttext, $word->word) !== false更快地检查,因为不需要正则表达式。

  2. 用于preg_match('/\b(' . implode('|', array_column($susWords, 'word')) . ')\b/', $user->flirttext)一次检查所有单词


查看完整回答
反对 回复 2023-10-21
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

您可以使用strpos()

https://www.php.net/manual/en/function.strpos.php

比正则表达式高效得多。

查看完整回答
反对 回复 2023-10-21
?
翻阅古今

TA贡献1780条经验 获得超5个赞

如果文本中只有标点符号,这种方法并不是很好。在这种情况下根本不应该使用。留在这里作为参考


您还可以使用 array_intersect 来避免循环:


$wordlist = explode(' ', $user->flirttext));

if (count(array_intersect($susWords, $wordlist)) > 0) {

    // found a bad word, do something

}


查看完整回答
反对 回复 2023-10-21
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信