我收到了以下请求:我想用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!
你们有没有想过如何达到这个目标?不一定要使用正则表达式。
答案 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);