2010-12-11 134 views
0

我有一個數據庫中不良單詞的列表。每當用戶提交意見,功能經過的不好的話整個列表,並與*PHP匹配整個單詞

$query = "SELECT * FROM bad_words ORDER BY id ASC"; 
    $result = mysql_query($query);  
    while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
    { 
    $word = $row['word']; 
    $replacement = "***"; 

     $userInput = str_replace(" $word ", $replacement." ", $userInput); 
    } 

替換每個字的問題是,str_replace函數不能正常工作。例如,「關聯」將成爲「*** ociated」。我也嘗試使用此preg_replace

$userInput = preg_replace("|\\b$\word\\b|i",$replacement,$userInput); 

但它不工作出於某種原因。數據庫中的一些不良詞包含字符如 @ | , ! *) .^' (@

我的猜測是這些字符導致preg_replace失敗。有沒有辦法解決?

回答

2

暫且不論這是否是一個好主意的問題,實現是非常簡單的:

$userInput = preg_replace('/\b' . preg_quote($word, '/') . '\b/i', $replacement, $userInput); 

您可以也可能通過使用單個替換提高性能:

$words = array(); 
$replacement = "***"; 
$query = "SELECT * FROM bad_words ORDER BY id ASC"; 
$result = mysql_query($query);  
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    $words[] = preg_quote($row['word'], '/'); 
} 

$userInput = preg_replace('/\b(' . implode('|', $words) . ')\b/i', $replacement, $userInput); 
1

有幾件事情:

  • 你的正則表達式包含在$其中\b就足夠了。另外兩個反斜槓也不是必需的。
  • 要匹配單詞中的任意字符,請首先應用preg_quote()
  • 您應該組裝一個完整的badwords列表,而不是迭代它們,否則preg_replace確實比str_replace慢。

嘗試:

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    $words[] = $row["word"]; 
} 

$words = array_map("preg_quote", $words); 

preg_replace(":\b(" . implode("|", $words) . ")\b:i", ...); 
+1

沒有第二個參數,'preg_quote'不會跳過定界符(在這種情況下爲'/')。 – eyelidlessness 2010-12-11 23:46:01

+0

@eyelidlessness有趣而且不明顯。避免使用上面古怪的pcre環境。 – mario 2010-12-11 23:50:04

1

你可以這樣做:

$words = array(); 
while(($row = mysql_fetch_array($result, MYSQL_ASSOC))) { 
    $words[] = '#\b' + preg_quote($row['word']) + '\b#i'; // escape special regex characters 
} 

$userInput = preg_replace($words, '***', $userInput); 

preg_replace可以採取表達式搜索的數組。

參考:preg_replacepreg_quote