PHP:带包装段落标记

PHP:带包装段落标记,php,htmlpurifier,substr,strip-tags,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" “简单

我需要编写一个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);
if(strpos($str,)==0&&strcmp(substr($str,-1,4),“

”) $str=substr($str,3,strlen($str)-4);
这是一个正则表达式解决方案:

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

$!i','$1',$str);
一个正则表达式,如

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

将匹配您的、

-使用该regexp并用emtpy字符串或任何您喜欢的内容替换匹配项

注:使用“忽略案例”标志以防万一

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

这是一种正则表达式方式

如果唯一的要求是剥去准确的包装线,则可以

如果您需要一个对html健壮的通用解决方案,您应该使用它。 (例如,如果要在包装段落标记中接受类、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";
}

这种模式不太花哨,但很有效
$inf=preg_replace('//',''$info)

这正是regexp的用途。不过,子字符串解决方案也可以。不要忘记各种不可见的字符,如空格、制表符和行尾。您相信输入的来源吗?它总是简单的

,还是像

?它来自CK编辑器,因此非恶意代码是可预测的,不允许任何样式。在这种情况下,我删除这些是为了避免冗余,而不是安全性。HTMLPurifier正在防止XSS处理这方面的事情。不,不是这样@上校:弹片。仅当您将其重新命名为字符串时。如果您认为它是标记、html、结构化文档。。。然后一些xpath/domdocument解析就是一种方法。嵌套的-标记不是会失败吗?试试看不,为什么要这样做?请注意开头^和结尾$indicator正则表达式将只匹配字符串开头的
,因为存在。所以它不会对嵌套的
标记做任何事情。它不处理具有任何属性的标记,因为问题似乎不需要它。他希望正则表达式保持嵌套的
标记不变-请参阅问题中的第三个测试用例字符串:SOK那你的正则表达式就完美了。我收回我的批评:)谢谢,这比单线解决方案更容易理解。它取代了所有

标记,而不仅仅是第一个和最后一个

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