用星号替换相同长度的文本用PHP保留空格

时间:2016-01-31 16:57:24

标签: php regex

我收到了以下请求:我想用PHP替换文本中带有相同长度星号的子串。子字符串使用<protected>标记进行掩码。我已经找到了解决方案,但我想更进一步:算法应该保留空格,例如空格或换行符。

我会举个例子。输入:

This is an example for <protected>hidden text
that's not covering one
not two
but four whole lines!</protected> Wow!

预期结果:

This is an example for ****** **** 
****** *** ******** ***
*** ***
*** **** ***** ****** Wow!

到目前为止我得到了什么:

echo preg_replace_callback('/<protected>(.*)<\/protected>/is',
    function ($matches) {
        return str_repeat('*', strlen($matches[1]));
    }, $input);

给(当然):

This is an example for ***************************************************************** Wow!

你们有没有想过如何达到这个目标?不一定要使用正则表达式。

3 个答案:

答案 0 :(得分:4)

您可以使用\S(匹配除空白之外的任何内容):

echo preg_replace_callback('~<protected>(.*)</protected>~is',
  function ($m) { return preg_replace('/\S/', '*', $m[1]); }, $input);

<强>输出:

This is an example for ****** ****
****** *** ******** ***
*** ***
*** **** ***** ****** Wow!

答案 1 :(得分:1)

挑战:

$pattern = '~(?:\G(?!\A)(?<!</protected>)|<protected>)\S(\s*)(?:</protected>)?~';
echo preg_replace($pattern, '*\1', $str);

但在我看来,首先在<protected>标签之间提取内容的方法更好。

答案 2 :(得分:0)

$newText = preg_replace_callback('/<protected>(.*)<\/protected>/is',
    function ($matches) {
        return str_repeat('*', strlen($matches[1]));
    }, $input);
$newText = str_replace(' ', '*', $newText);

http://php.net/manual/de/function.str-replace.php