我有一個 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 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消