我正在尝试在PHP中创建一个错误的单词过滤器,它将分析单词并匹配已知坏单词的数组,但保留单词的第一个字母并用星号替换其余单词。例如:
fook会成为f *** 射击将成为s * *
我不知道的唯一部分是如何保持字符串中的第一个字母,以及如何在保持相同字符串长度的同时用其他字母替换剩余字母。
$string = preg_replace("/\b(". $word .")\b/i", "***", $string);
谢谢!
答案 0 :(得分:3)
$string = 'fook would become';
$word = 'fook';
$string = preg_replace("~\b". preg_quote($word, '~') ."\b~i", $word[0] . str_repeat('*', strlen($word) - 1), $string);
var_dump($string);
答案 1 :(得分:1)
$string = preg_replace("/\b".$word[0].'('.substr($word, 1).")\b/i", "***", $string);
答案 2 :(得分:1)
这可以通过多种方式完成,非常奇怪的自动生成的regexp ...
但我相信使用preg_replace_callback()
会更加健壮
<?php
# as already pointed out, your words *may* need sanitization
foreach($words as $k=>$v)
$words[$k]=preg_quote($v,'/');
# and to be collapsed into a **big regexpy goodness**
$words=implode('|',$words);
# after that, a single preg_replace_callback() would do
$string = preg_replace_callback('/\b('. $words .')\b/i', "my_beloved_callback", $string);
function my_beloved_callback($m)
{
$len=strlen($m[1])-1;
return $m[1][0].str_repeat('*',$len);
}