我在数据库中有一个坏词列表。每当用户提交评论时,一个函数会遍历整个坏词列表,并用 * 替换每个单词
$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失败。反正有吗?
答案 0 :(得分: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 :(得分:1)
有几件事:
$
,其中\b
就足够了。另外两个反斜杠也不是必需的。preg_quote()
。尝试:
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$words[] = $row["word"];
}
$words = array_map("preg_quote", $words);
preg_replace(":\b(" . implode("|", $words) . ")\b:i", ...);
答案 2 :(得分: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
可以使用一系列表达式来搜索。