2010-12-11 133 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