想实现帖子部分隐藏内容的功能。
暂定使用标志:...
用下面的正则可以实现:
|[hhh[sS]*/hhh]|
但如果内容中有两块隐藏内容,就无法两块分别替换了,会从第一块的开始标志到第二块的结束标志中的内容都当一块内容替换。。。
如下面的例子:
原内容
这是正常内容1,这是正常内容1,
这是正常内容1,这是正常内容1。
第一块隐藏内容,
第一块隐藏内容
第一块隐藏内容
这是正常内容2,这是正常内容2,
这是正常内容2,这是正常内容2。
第二块隐藏内容,
第二块隐藏内容
第二块隐藏内容
这是正常内容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="|[hhh[sS](.*?)|"; //可以实现多块替换
//$pattern="|[hhh[sS](.*?)/hhh]|"; //可以实现多块替换,可以不加[/
//$pattern="|[hhh[sS]*|"; //不能实现多块替换,加了[/也不行
$content= preg_replace($pattern, $hidden_str, $content);
问题应该出在”[sS]*“的*上,把*换成(.*?)就可以了!