使用Regex屏蔽除一个单词的首字母以外的所有字母

时间:2011-02-17 01:19:34

标签: php regex preg-replace

我正在尝试在PHP中创建一个错误的单词过滤器,它将分析单词并匹配已知坏单词的数组,但保留单词的第一个字母并用星号替换其余单词。例如:

fook会成为f *** 射击将成为s * *

我不知道的唯一部分是如何保持字符串中的第一个字母,以及如何在保持相同字符串长度的同时用其他字母替换剩余字母。

$string = preg_replace("/\b(". $word .")\b/i", "***", $string);

谢谢!

3 个答案:

答案 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);
}