$content = '
<p>
这里是帖子的内容。
</p>
<p>
<img src="/upload/image/20150429/1430288803746265.gif" title="1430288803746265.gif" alt="gif-0009.gif"/>
</p>
<p>
<span>这里是帖子的其他内容</span>
</p>
<pre class="brush:cf;toolbar:false">$user = $this->session->get('auth');
$baa_id=(int)$_POST['baa_id'];
$time = date('Y-m-d H:i:s');
</pre>
<p>
<span style="color: rgb(128, 128, 128); line-height: 16px;">这里是帖子的其他内容</span>
</p>
';
preg_match_all('#<p[^>]*>([^(?:</?p>)]*)</p>#',$content,$matches);
print_r($matches);
匹配的结果:
Array
( [0] => Array ( [0] => <p> 这里是帖子的内容。 </p> ) [1] => Array ( [0] => 这里是帖子的内容。 ) )
为什么p标签之间有img span等其他标签的内容不能被匹配呢?
大家讲道理2017-04-10 15:35:58
已更新,preg_match_all('#<p(\s*|\s[^>]*)>([\s\S]*?)</p>#',$content,$matches);
这是完整的写法,你的问题在于你错误的以为[^(?:</?p>)]
代表的是除<p
>或者</p>
标签以外的匹配。实际上[^(?:</?p>)]
等同于[^?:</?p>]
这样看就明白了吧