PHP:剥离包裹段落标记

时间:2011-01-01 21:00:12

标签: php htmlpurifier substr strip-tags

我需要编写一个PHP函数来删除字符串中的开始和结束段落标记,但前提是它们位于开头/结尾。所以字符串:

"Simple Test"
"<p>Here</p>"
"<p>Test <p>Nested</p> Outside </p>"

输出:

"Simple Test"
"Here"
"Test <p>Nested</p> Outside"

HTMLPurifier可以执行此操作还是应该使用substr?我的第一次尝试是:

if(strpos($str,'<p>') === 0  && strcmp(substr($str,-1,4),'</p>'))
$str = substr($str,3,strlen($str)-4);

4 个答案:

答案 0 :(得分:14)

这是一个正则表达式解决方案:

$str = preg_replace('!^<p>(.*?)</p>$!i', '$1', $str);

答案 1 :(得分:2)

正则表达式,如

</??p(?:\s+\w*)>

将与您的&lt; p \&gt;,&lt; / p&gt;相匹配和&lt; p somestuff&gt; - 使用该正则表达式并将匹配替换为emtpy字符串或您喜欢的任何内容。

HTH

PS:使用“忽略大小写”标志,以防万一。

编辑:使该组成为非捕获组。

答案 2 :(得分:2)

这是一种正则表达式。

如果唯一的要求就是剥去确切的包裹字符串<p></p>

如果你需要一个对html很健壮的通用解决方案,你应该使用DOM。 (例如,如果要在包装段落标记中加入类,ID和变量属性。) 但请注意,加载domdocument会使您的html正常化。

<?
$str = array(
"Simple Test",
"<p>Here</p>",
"<p>Test <p>Nested</p> Outside </p>"
);

foreach($str as $st) {
  echo $st." ---> ";
  if(preg_match('#<p>(.+)</p>#',$st,$match) === 1) { // 1 if matched, 0 if not matched
    $st = $match[1]; // if matched, replace our string by the match
  }
  echo $st."\n";
}

这将生成此输出:

Simple Test ---> Simple Test
<p>Here</p> ---> Here
<p>Test <p>Nested</p> Outside </p> ---> Test <p>Nested</p> Outside 
你可以轻松地制作一个衬垫。例如,使用preg_replace和regex反向引用,你可以替换匹配的字符串...但我希望在这种形式下你更容易理解。

答案 3 :(得分:-1)

不那么花哨的模式,但有效$inf = preg_replace('/<[\/]*?p.*?>/', '', $info);