我有一些简单的代码可以进行preg匹配:
$bad_words = array('dic', 'tit', 'fuc',); //for this example i replaced the bad words
for($i = 0; $i < sizeof($bad_words); $i++)
{
if(preg_match("/$bad_words[$i]/", $str, $matches))
{
$rep = str_pad('', strlen($bad_words[$i]), '*');
$str = str_replace($bad_words[$i], $rep, $str);
}
}
echo $str;
因此,如果$str
为"dic"
,结果将为“ * ”,依此类推。
现在$str == f.u.c
存在一个小问题。解决方案可能是使用:
$pattern = '~f(.*)u(.*)c(.*)~i';
$replacement = '***';
$foo = preg_replace($pattern, $replacement, $str);
在这种情况下,无论如何我都会得到***
。我的问题是将所有这些代码放在一起。
我试过了:
$pattern = '~f(.*)u(.*)c(.*)~i';
$replacement = 'fuc';
$fuc = preg_replace($pattern, $replacement, $str);
$bad_words = array('dic', 'tit', $fuc,);
for($i = 0; $i < sizeof($bad_words); $i++)
{
if(preg_match("/$bad_words[$i]/", $str, $matches))
{
$rep = str_pad('', strlen($bad_words[$i]), '*');
$str = str_replace($bad_words[$i], $rep, $str);
}
}
echo $str;
我的想法是$fuc
变成fuc
然后我将它放在数组中然后数组完成它的工作,但这似乎不起作用。
答案 0 :(得分:3)
首先,您可以使用一个(动态生成的)正则表达式执行所有的坏词替换,如下所示:
$bad_words = array('dic', 'tit', 'fuc',);
$str = preg_replace_callback("/\b(?:" . implode( '|', $bad_words) . ")\b/",
function( $match) {
return str_repeat( '*', strlen( $match[0]));
}, $str);
现在,您遇到的问题是人们在单词之间添加句点,您可以使用其他正则表达式进行搜索并替换它们。但是,您必须记住.
匹配正则表达式中的任何字符,并且必须进行转义(使用preg_quote()
或反斜杠)。
$bad_words = array_map( function( $el) {
return implode( '\.', str_split( $el));
}, $bad_words);
这将创建一个类似于:{/ p>的$bad_words
数组
array(
'd\.i\.c',
't\.i\.t',
'f\.u\.c'
)
现在,您可以使用这个新的$bad_words
数组,就像上面那样替换这些混淆的数组。
提示:你可以使这个array_map()
调用“更好”,因为它可以更聪明地捕获更多的混淆。例如,如果您想捕获用句点或空格字符或逗号分隔的错误单词,则可以执行以下操作:
$bad_words = array_map( function( $el) {
return implode( '(?:\.|\s|,)', str_split( $el));
}, $bad_words);
现在,如果你让混淆组成为可选项,你会发现更多不好的词:
$bad_words = array_map( function( $el) {
return implode( '(?:\.|\s|,)?', str_split( $el));
}, $bad_words);
现在,坏词应该匹配:
f.u.c
f,u.c
f u c
fu c
f.uc
还有更多。