据此不 \b
支持除[A-Za-z0-9_]
.
请注意,您必须转义您的正则表达式,因为您是从字符串生成它(并且 PHP 编译器在创建此字符串时不知道它是正则表达式)。
使用正则表达式/(^|\s)WORD($|\s)/i
似乎有效。
代码示例:
$text = "This is a $1ut ( Y ) @ss @sshole a$$ ass test with grass and passages.";
$blacklist = array(
'$1ut',
'( Y )',
'@ss',
'@sshole',
'a$$',
'ass'
);
foreach ($blacklist as $word) {
$pattern = "/(^|\\s)" . preg_quote($word) . "($|\\s)/i";
$replace = " " . str_repeat('*', strlen($word)) . " ";
$text = preg_replace($pattern, $replace, $text);
}
echo $text;
输出:
This is a **** ***** *** ******* *** *** test with grass and passages.
请注意,如果您的字符串以其中一个单词开头或结尾,我们将在每个结尾的匹配项中添加一个空格,这意味着文本之前或之后会有一个空格。你可以用trim()
更新;
另请注意,这不以任何方式考虑标点符号。
the other user has an ass. and it is nice
例如会通过。
为了克服这一点,您可以进一步扩展它:
/(^|\\s|!|,|\.|;|:|\-|_|\?)WORD($|\\s|!|,|\.|;|:|\-|_|\?)/i
这意味着您还必须更改我们替换的方式:
$text = "This is a $1ut ( Y ) @ss?@sshole you're an ass. a$$ ass test with grass and passages.";
$blacklist = array(
'$1ut',
'( Y )',
'@ss',
'@sshole',
'a$$',
'ass'
);
foreach ($blacklist as $word) {
$pattern = "/(^|\\s|!|,|\\.|;|:|\\-|_|\\?)" . preg_quote($word) . "($|\\s|!|,|\\.|;|:|\\-|_|\\?)/i";
$replace = '$1' . str_repeat('*', strlen($word)) . '$2';
$text = preg_replace($pattern, $replace, $text);
}
echo $text;
并添加所有其他标点符号等。
输出:
This is a **** ***** ***?******* you're an ***. *** *** test with grass and passages.