亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號