繁体   English   中英

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

[英]How to Remove the nested paragraph tag using Regular Expression in PHP?

我正在使用简单Html Dom通过Html进行解析。在这种情况下,如果它是嵌套方式,则无法加载<p>标签

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

我不知道如何使用Regex替换内部的<p></p>标记。

我的预期输出是:

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

有人请帮我完成这项工作

不允许嵌套p标签。 可以代替使用:

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

有关更多详细信息,请参见下面的链接

嵌套<p>将不起作用,而嵌套<div>将起作用吗?

请尝试使用此功能删除<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);
?>

希望对您有帮助。

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

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

(?!^)<p>)与所有<p>标记匹配,但字符串开头的<p>除外

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

您可以将捕获的<p></p>替换为null并将其删除。

这是一个工作演示

编辑:

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

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

(<p>)搜索<p>标签

((?!<\\/p>).)*?(<p>)捕获<p>一个<p>标记内的</p>标记,中间没有(嵌套的<p>标记) </p>标记

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

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

标签。 您需要一次又一次地运行它,直到没有更多的匹配为止。

您可以在这里找到更新的正则表达式演示

更新:

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

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

在这里演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM