我需要编写一个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);
答案 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);