从 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>"
我想转换这个字符串,以便删除空标签对(但保留像 <br/>
这样的空标签)。例如,这个转换的结果应该将上面的字符串转换为
"<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>
【讨论】:
我测试过了,上面的代码打印出<p>Hello<br />world</p>
我注意到这段代码删除了 div ex 中的空 img: 所以我还检查了空大小:&& element.childNodes()。 size() == 0 ,我的更新正确吗?
我认为如果if
语句是这样的会更正确:if ((!element.hasText() && element.isBlock()) || (!element.hasText() && element.childNodes().isEmpty())) element.remove()
因为它还删除了空的非块元素,例如<span></span>
如何删除任何空标签??
@Mark:您的方法的主要问题是自动关闭标签。您还将过滤<br>
,应该保留!【参考方案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 中是不合法的。 此解决方案仅适用于<p></p>
,不适用于等效的<p/>
或<p> </p>
。【参考方案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 片段中删除空标签对的主要内容,如果未能解决你的问题,请参考以下文章