4

我需要编写一个 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

4 回答 4

17

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

$str = preg_replace('!^<p>(.*?)</p>$!i', '$1', $str);
于 2011-01-01T21:20:29.173 回答
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 和正则表达式反向引用,您可以替换匹配的字符串......但我希望这种形式对您来说更容易理解。

于 2011-01-01T21:26:37.980 回答
2

像一个正则表达式

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

将匹配您的 <p\ >、</p> 和 <p somestuff> - 使用该正则表达式并将匹配替换为 emtpy 字符串或您喜欢的任何内容。

高温高压

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

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

于 2011-01-01T21:23:10.147 回答
-1

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

于 2015-09-02T18:53:36.977 回答