PHP匹配整个单词

时间:2010-12-11 23:36:44

标签: 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失败。反正有吗?

3 个答案:

答案 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()
  • 你应该组装一个完整的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", ...);

答案 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可以使用一系列表达式来搜索。

参考:preg_replacepreg_quote