从 HTML 片段中删除空标签对

Posted

技术标签:

【中文标题】从 HTML 片段中删除空标签对【英文标题】:remove empty tag pairs from HTML fragment 【发布时间】:2012-02-01 10:04:31 【问题描述】:

我有一个用户提交的字符串,其中包含 html 内容,例如

"<p></p><div></div><p>Hello<br/>world</p><p></p>"

我想转换这个字符串,以便删除空标签对(但保留像 &lt;br/&gt; 这样的空标签)。例如,这个转换的结果应该将上面的字符串转换为

"<p>Hello<br/>world</p>"

我想使用 JSoup 来执行此操作,因为我的类路径中已经有了它,而且我最容易在服务器端执行此转换。

【问题讨论】:

【参考方案1】:

下面是一个例子(使用 JSoup):

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>";
Document doc = Jsoup.parse(html);

for (Element element : doc.select("*")) 
    if (!element.hasText() && element.isBlock()) 
        element.remove();
    


System.out.println(doc.body().html())

上面代码的输出就是你要找的:

<p>Hello<br />world</p>

【讨论】:

我测试过了,上面的代码打印出&lt;p&gt;Hello&lt;br /&gt;world&lt;/p&gt; 我注意到这段代码删除了 div ex 中的空 img: 所以我还检查了空大小:&& element.childNodes()。 size() == 0 ,我的更新正确吗? 我认为如果if 语句是这样的会更正确:if ((!element.hasText() &amp;&amp; element.isBlock()) || (!element.hasText() &amp;&amp; element.childNodes().isEmpty())) element.remove() 因为它还删除了空的非块元素,例如&lt;span&gt;&lt;/span&gt; 如何删除任何空标签?? @Mark:您的方法的主要问题是自动关闭标签。您还将过滤&lt;br&gt;,应该保留!【参考方案2】:

不太熟悉 jsoup,但您可以通过简单的正则表达式替换来做到这一点:

String html = "<p></p><div></div><p>Hello<br/>world</p><p></p>";
html = html.replaceAll("<([^>]*)></\\1>", "");

尽管使用完整的解析器,您可能只是在处理过程中丢弃空内容,这取决于您最终要使用它做什么。

【讨论】:

replaceAll("[a-zA-Z0-9]*>", "");可能看起来比允许 > 以外的任何内容更好 但是 ItalicBold 呢?这是不好的使用,但仍然合法。我认为您需要能够准确地重新匹配第一组尖括号中使用的内容。 @PragalathanM,我考虑过这一点,但标签也允许使用连字符、下划线等。一旦你开始添加所有这些字符,语句就会开始看起来很难看(你可能会错过一些)。 @FrankieTheKneeMan: ItalicBold 在 HTML 中是不合法的。 此解决方案仅适用于&lt;p&gt;&lt;/p&gt;,不适用于等效的&lt;p/&gt;&lt;p&gt; &lt;/p&gt;【参考方案3】:

Jsoup 将从用户输入的 HTML 中生成正确的 XML。使用 XML 解析器查找并删除所有空标签。我认为这比正则表达式更好。看这里:Java Remove empty XML tags 您还可以使用 JSoup 为您查找空标签。看这里:http://jsoup.org/cookbook/extracting-data/selector-syntax 并使用 Node.remove() 方法。

【讨论】:

【参考方案4】:

如果你使用jquery,你可以这样做

var tags = "<p></p><div></div><p>Hello<br/>world</p><p></p>";

$("<div id='mydiv'>"+tags+"</div>").appendTo($('body'));
$('#mydiv').children().each(function()
    var elem = $(this);
    if(elem.html() === "") elem.remove();
);

小提琴:http://jsfiddle.net/LqCx5/2/

【讨论】:

更新了答案..请检查,我已经在我的机器上测试过它的工作正常。 这将删除所有空标签,包括 不,伙计..您应该恢复反对票...它没有删除..请检查小提琴jsfiddle.net/LqCx5/3 ...检查正文输出,你好和世界在不同的行。【参考方案5】:

不知道 Jsoup,下面的代码也适用于简单的 javascript 正则表达式。 试试下面的代码。

function removeall()
var tagarray=new Array("<p>","<div>");
source="<p></p><div></div><p>Hello<br/>world</p><p></p>";
for ( var int = 0; int < tagarray.length; int++) 
tag2=tagarray[int].replace("<","</");
var tagpair=new RegExp(tagarray[int]+tag2,"g");
source=source.replace(tagpair,"");
    
alert(source);

【讨论】:

这是 Java 问题,因此 JavaScript 代码不是有效答案。

以上是关于从 HTML 片段中删除空标签对的主要内容,如果未能解决你的问题,请参考以下文章

防止 Proguard 删除片段的空构造函数

活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

刷新标签片段和 viewpager

访问片段的子视图时出现空指针异常

调用 .remove(fragment) 后片段未被删除

Android,从其他片段返回的空列表视图