如何在字符串中移除HTML标签中的所有HTML属性

5

我正在尝试处理一个包含HTML的字符串,需要删除一些标签(img、object)和其他所有HTML标签,同时删除它们的属性。例如:

<div id="someId" style="color: #000000">
   <p class="someClass">Some Text</p>
   <img src="images/someimage.jpg" alt="" />
   <a href="somelink.html">Some Link Text</a>
</div>

Would become:

<div>
   <p>Some Text</p>
   Some Link Text
</div>

我正在尝试:

string.replaceAll("<\/?[img|object](\s\w+(\=\".*\")?)*\>", ""); //REMOVE img/object

我不确定如何删除标签内的所有属性。

如果有帮助,将不胜感激。

谢谢。


我怀疑你能否用一个正则表达式完成这个任务。 - Ash Burlaczenko
我怀疑你无法使用正则表达式完成这个任务。 - karim79
我不需要一个正则表达式,只需要一些有意义的东西,能够满足我的需求。你会如何建议实现它? - fanfavorite
4个回答

8
您可以这样移除所有属性:

string.replaceAll("(<\\w+)[^>]*(>)", "$1$2");

这个表达式匹配一个开标签,但只捕获它的头部<div和闭合标签>作为第1组和第2组。 replaceAll使用对这些组的引用将它们连接回输出中作为$1$2。这样就去掉了标记中间的属性。


由于某些原因,这个程序给我返回了一个java.lang.NullPointerException错误。 - fanfavorite
1
不应该,除非你的字符串是null - Sergey Kalinichenko
在我进行任何操作之前,我会检查它是否为空或空字符串。如果我更改了replaceAll部分,那么它可以正常工作,所以不确定replaceAll部分出现了什么问题。 - fanfavorite
@fanfavorite 你能否在调用 replaceAll 之前添加控制台输出或在调试器中检查该值?我在这里的在线测试器中检查了这个表达式,它可以按照你需要的方式正常工作。 - Sergey Kalinichenko
请注意,这个操作不会删除<a>标签,而是将其内容保留,如期望的结果所示。 - BalusC
@BalusC 这可以通过在删除属性之后从OP运行"kill tags" transform来解决。当然,需要将a与当前需要删除的imgobject一起添加到需要删除的标签列表中。 - Sergey Kalinichenko

8
我不建议使用正则表达式来过滤特定标签。这将是一项很艰巨的工作,并且永远无法完全可靠。使用普通的HTML解析器,如Jsoup。它提供了Whitelist API来清理HTML。另请参见this cookbook document
以下是一个使用Jsoup的起始示例,它只允许在所选Whitelist的标准标签旁边使用<div><p>标签,该示例中的Whitelist#simpleText()
String html = "<div id='someId' style='color: #000000'><p class='someClass'>Some Text</p><img src='images/someimage.jpg' alt='' /><a href='somelink.html'>Some Link Text</a></div>";
Whitelist whitelist = Whitelist.simpleText(); // Whitelist.simpleText() allows b, em, i, strong, u. Use Whitelist.none() instead if you want to start clean.
whitelist.addTags("div", "p");
String clean = Jsoup.clean(html, whitelist);
System.out.println(clean);

这导致
<div>
   <p>Some Text</p>Some Link Text
</div>

参见:


很难告诉人们,即使是在标签方面,使用正则表达式的用户也很少能够应用简单的正则表达式。每个人都认为自己都懂,但实际上几乎没有人真正掌握。所以这有点像以某种社交可接受的方式说“你不够聪明”。相当难以建设性地表达。 - tchrist

1

/<(/?\w+) .*?>/<\1>/ 可能会奏效 - 它获取标签(匹配组)并读取关闭括号之前的任何属性,然后将其替换为只有方括号和标签。


-1

如果您使用SAX或DOM,并获取节点名称和值,然后删除所有属性,那么这可能会更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接