当前位置: 代码迷 >> PHP >> 求preg_replace正则匹配改善
  详细解决方案

求preg_replace正则匹配改善

热度:87   发布时间:2016-04-28 18:16:35.0
求preg_replace正则匹配改进
本帖最后由 romy2008 于 2014-11-14 20:20:28 编辑
<?php
$body='副标题#e#<p align="center" class="picView">
<img alt="" src="/uploads/allimg/140806/1-140P6031044.jpg" /></p>
<p>
  “三川玲”是一名广州出版人,真名叫做李玲。取“三川玲”做笔名,是为了纪念家乡风物。毕业于华南师范大学, 在一家杂志做过十年记者、编辑,曾是当时保健图书热的推手之一。和很多职场妈妈一样,六年前当她生下女儿后开始关注育儿问题,并从事童书出版工作。</p>
#p#千万不要随大流#e#<p>
  总之,要以我为主,为我服务的态度,千万不要随大流、千万不要超出自己的经济能力,千万不要抱着早教有魔力的态度,去盲目地选择早教机构。</p>
#p#为了升学,突击学习#e#
<p>
  <strong>入学前的速成班:为了升学,突击学习</strong></p>
<p>
  随着丸子年龄的增长,我很快发现,有一类针对3~6岁孩子的早教班风风火火地存在着。</p>
';

$body=preg_replace('正则', '',$body);
echo $body;


//这是DEDECMS里的内容,现在我要做一个阅读全文的页面,也就是这页文章不分页,要把内容里面的分页标记都去了,要去除的标记主要包括有:
//1、段首的分页标记“副标题#e#”
//2、中间的分页标记“#p#千万不要随大流#e#”
//说明:#e#是标题,#p#是分页,当然删除也包括#e#和#p#字符了。


?>


对此,xuzuning 写了个正则
$body=preg_replace('/(?:^|#p#).*?#e#\s*/s', '',$body);

但是我的需求忽略了一个问题,就是当前段首没有“副标题#e#”分页标题的情况,比如:


<?php
$body='<p align="center" class="picView">
<img alt="" src="/uploads/allimg/140806/1-140P6031044.jpg" /></p>
<p>
  “三川玲”是一名广州出版人,真名叫做李玲。取“三川玲”做笔名,是为了纪念家乡风物。毕业于华南师范大学, 在一家杂志做过十年记者、编辑,曾是当时保健图书热的推手之一。和很多职场妈妈一样,六年前当她生下女儿后开始关注育儿问题,并从事童书出版工作。</p>
#p#千万不要随大流#e#<p>
  总之,要以我为主,为我服务的态度,千万不要随大流、千万不要超出自己的经济能力,千万不要抱着早教有魔力的态度,去盲目地选择早教机构。</p>
#p#为了升学,突击学习#e#
<p>
  <strong>入学前的速成班:为了升学,突击学习</strong></p>
<p>
  随着丸子年龄的增长,我很快发现,有一类针对3~6岁孩子的早教班风风火火地存在着。</p>
';

$body=preg_replace('正则', '',$body);
echo $body;


//这是DEDECMS里的内容,现在我要做一个阅读全文的页面,也就是这页文章不分页,要把内容里面的分页标记都去了,要去除的标记主要包括有:
//1、段首的分页标记“副标题#e#”
//2、中间的分页标记“#p#千万不要随大流#e#”
//说明:#e#是标题,#p#是分页,当然删除也包括#e#和#p#字符了。


?>

这样会把第一页的都给过滤了,求改进,当段首没有分页标题标记时,不删除第一页内容。
------解决思路----------------------
观察了一下,#p# 和 #e# 总是在一行的
body=preg_replace('/(?:^
------解决思路----------------------
#p#).*?#e#\s*/', '',$body);