如何在PHP中使用正则表达式删除嵌套的段落标记?

时间:2017-02-21 11:54:48

标签: php html regex simple-html-dom

我正在使用简单的Html Dom 来解析Html。在此我无法加载<p>标记(如果它是嵌套的方式)

<p>Hello there <p>Some Content </p>outer content <p>Some More content</p></p>

我不知道如何使用正则表达式替换内部<p></p>标记。

我的预期输出是:

<p>Hello there Some content outer content Some More content</p>

有人请帮助我完成这项工作

3 个答案:

答案 0 :(得分:0)

不允许使用嵌套的p标签。取而代之的是你可以使用:

<p>Hello there <span>Some Content </span>outer content</p>

有关详细信息,请参阅以下链接

Nesting <p> won't work while nesting <div> will?

答案 1 :(得分:0)

请尝试使用此功能删除<p></p>代码

<?php function remove_p($input) {
    $input=str_ireplace('<p>','',$input);
    $input=str_ireplace('</p>','',$input);    
    return "<p>".$input."</p>";  
} 
?>

请参阅如何使用此功能:

<?php $val = "<p>Hello there <p>Some Content </p>outer content <p>Some More content</p></p>";
echo remove_p($val);
?>

希望,这可能会对你有所帮助。

答案 2 :(得分:0)

假设您的整个有问题的<p>标记在一行中,您可以使用以下正则表达式

((?!^)<p>)|(<\/p>(?!$))

(?!^)<p>)匹配所有<p>代码,但不包括字符串开头的<p>

(<\/p>(?!$)匹配所有</p>代码,但不包括字符串末尾的</p>

您只需将这些捕获的<p></p>替换为null,然后将其删除即可。

这是一个有效的demo

编辑:

由于您输入的是html文件,因此您可以尝试使用此更新的正则表达式

(<p>)((?!<\/p>).)*?(<p>).*?(<\/p>)

(<p>)搜索<p>代码

((?!<\/p>).)*?(<p>)在第一个<p>代码中捕获<p>代码,其中没有任何</p>代码(嵌套<p>代码)

.*?(<\/p>)捕获嵌套<p>的结束标记。

只需删除捕获组3和4,即可删除嵌套的

标记。你需要一次又一次地运行它,直到没有更多的匹配。

您可以找到更新的正则表达式演示here

更新:

使用此正则表达式(.*<p>)(((?!<\/p>).)*?)(<p>)(.*?)(<\/p>)(.*)

并将其替换为\1\2\5\7,这将仅删除嵌套标记。

演示here