Allen 2022-10-08 16:04:20 5847 0 0 0 0
正则表达式,如何实现替换标签内的内容(按标签实现多块内容替换),想实现帖子部分隐藏内容的功能。暂定使用标志:[hhh],但如果内容中有两块隐藏内容,就无法两块分…

想实现帖子部分隐藏内容的功能。

暂定使用标志:

作者已经将内容设为隐藏,不能查看!

用下面的正则可以实现:

|
作者已经将内容设为隐藏,不能查看!
中的内容都当一块内容替换。。。

如下面的例子:

原内容

这是正常内容1,这是正常内容1,
这是正常内容1,这是正常内容1。
[hhh]第一块隐藏内容,
第一块隐藏内容
第一块隐藏内容
[/hhh]
这是正常内容2,这是正常内容2,
这是正常内容2,这是正常内容2。
[hhh]第二块隐藏内容,
第二块隐藏内容
第二块隐藏内容
[/hhh]
这是正常内容3,这是正常内容3,
这是正常内容3,这是正常内容3。

现在的结果:

这是正常内容1,这是正常内容1,
这是正常内容1,这是正常内容1。
“内容已经隐藏”
这是正常内容3,这是正常内容3,
这是正常内容3,这是正常内容3。

希望实现的结果:

这是正常内容1,这是正常内容1,
这是正常内容1,这是正常内容1。
“此内容已经隐藏”
这是正常内容2,这是正常内容2,
这是正常内容2,这是正常内容2。
“此内容已经隐藏”
这是正常内容3,这是正常内容3,
这是正常内容3,这是正常内容3。

如果实现这种两块甚至多块内容分别替换,不影响其他内容呢!

...

在网上请教大神,给了下面的代码:

            $content = preg_replace_callback("/
作者已经将内容设为隐藏,不能查看!
/",                  function ($matches) {                     return str_replace($matches[1],$hidden_str,$matches[0]);                 }, $content);

第一次看到这种用法,参数还可以声明函数。

试了一下,还是不行。

不过参考大神的代码,改进了一下,居然实现了。多试了几次,找到问题所在,如下:

$pattern="|[hhh[sS]*/hhh]|";  // was 不能实现多块替换
$pattern="|
作者已经将内容设为隐藏,不能查看!
|";  //可以实现多块替换 //$pattern="|[hhh[sS](.*?)/hhh]|";   //可以实现多块替换,可以不加[/ //$pattern="|
作者已经将内容设为隐藏,不能查看!
|";    //不能实现多块替换,加了[/也不行 $content= preg_replace($pattern, $hidden_str, $content);

问题应该出在”[sS]*“的*上,把*换成(.*?)就可以了!


Tag: 正则表达式
我也要发一个   ·   返回首页   ·   返回[编程]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[编程]   ·   返回顶部