PHP匹配整个单词

PHP匹配整个单词,php,Php,我在数据库里有一个坏单词的列表。每次用户提交评论时,一个函数都会遍历整个坏单词列表,并将每个单词替换为* 问题是str_replace不能正常工作。例如,“关联”将变为“***关联”。我也试着用这个preg_替换 $userInput = preg_replace("|\\b$\word\\b|i",$replacement,$userInput); 但出于某种原因,它不起作用。数据库中的一些坏单词包含如下字符 @|,!*)。^'(@ 我的猜测是这些字符导致preg_replace失败。这有什

我在数据库里有一个坏单词的列表。每次用户提交评论时,一个函数都会遍历整个坏单词列表,并将每个单词替换为*

问题是str_replace不能正常工作。例如,“关联”将变为“***关联”。我也试着用这个preg_替换

$userInput = preg_replace("|\\b$\word\\b|i",$replacement,$userInput);
但出于某种原因,它不起作用。数据库中的一些坏单词包含如下字符
@|,!*)。^'(@


我的猜测是这些字符导致preg_replace失败。这有什么原因吗?

有几点:

  • 您的正则表达式包含一个
    $
    ,其中
    \b
    就足够了。也不需要两个反斜杠
  • 要匹配单词中的任意字符,请先应用
    preg_quote()
  • 你应该收集一个完整的坏单词列表,而不是重复它们,否则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", ...);

有两件事:

  • 您的正则表达式包含一个
    $
    ,其中
    \b
    就足够了。也不需要两个反斜杠
  • 要匹配单词中的任意字符,请先应用
    preg_quote()
  • 你应该收集一个完整的坏单词列表,而不是重复它们,否则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", ...);
你可以做:

$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
可以获取要搜索的表达式数组

参考:,

您可以执行以下操作:

$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
可以获取要搜索的表达式数组


参考资料:,

抛开这是否是一个好主意的问题,实现非常简单:

$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);

抛开这是否是一个好主意的问题不谈,实施相当简单:

$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);

如果没有第二个参数,
preg_quote
将不会转义定界符(
/
).@有趣且不明显。通过上面古怪的pcre封套避免。