正则表达式,如何实现替换标签内的内容(按标签实现多块内容替换),想实现帖子部分隐藏内容的功能。暂定使用标志:[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:
正则表达式