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