说我有像这样的HTML
<b><b>hello</b></b>
<b><i>hello</i></b>
<b><b><i><b>hello</b></i></b></b>
<b><u><b><i><u><i>hello</i></u></i></b></u></b>
如何删除/合并冗余标记,使输出看起来像这些
<b>hello</b>
<b><i>hello</i></b>
<b><i>hello</i></b>
<b><u><i>hello</i></u></b>
答案 0 :(得分:3)
使用jsoup library您的代码可能如下所示:
public static void main(String[] args) {
String html = "<b><b>hello</b></b>\r\n" + "<b><i>hello</i></b>\r\n"
+ "<b><b><i><b>hello</b></i></b></b>\r\n"
+ "<b><u><b><i><u><i>hello</i></u></i></b></u></b>";
Document doc = Jsoup.parseBodyFragment(html);
System.out.println("before: ");
System.out.println(doc.body());
for (Element el : doc.getAllElements()) {
if (hasSameTypeAncestor(el)) {
el.unwrap();
}
}
System.out.println("========");
System.out.println("after:");
System.out.println(doc.body());
}
private static Set<String> tagsIDontWantToNest = new HashSet<>(Arrays.asList("b","i","u"));
private static boolean hasSameTypeAncestor(Element element) {
Tag tag = element.tag();
//handle only these tags: <b> <i> <u>
if (tagsIDontWantToNest.contains(tag.getName())) {
for (Element el : element.parents()) {
if (el.tag().equals(tag)) {
return true;
}
}
}
return false;
}
输出:
before:
<body>
<b><b>hello</b></b>
<b><i>hello</i></b>
<b><b><i><b>hello</b></i></b></b>
<b><u><b><i><u><i>hello</i></u></i></b></u></b>
</body>
========
after:
<body>
<b>hello</b>
<b><i>hello</i></b>
<b><i>hello</i></b>
<b><u><i>hello</i></u></b>
</body>
答案 1 :(得分:0)
我认为在java中执行此操作的最简单方法是使用String.replace API截断额外的HTML标记。
示例:
public static void main(String[] args) {
String line = "<b><b>hello</b></b>";
String[] tagsToRemove = { "b", "i" }; // Extend this to include more tags to remove
for (String tagToRemove : tagsToRemove) {
line = delRedundantTags(line, tagToRemove);
}
System.out.println(line);
}
private static String delRedundantTags(String html, String tag) {
String headTagPattern = "<" + tag + ">";
String endTagPattern = "</" + tag + ">";
return html.replace(headTagPattern + headTagPattern, headTagPattern). /*Remove the front tag*/
replace(endTagPattern + endTagPattern, endTagPattern);
}
这种方法的问题在于您需要知道什么是冗余标记,例如上面的代码只适用于Bold和italic标记以删除更多冗余标记,然后您必须扩展tagsToRemove数组。
注意:如果冗余标记之间有空格,那么API将无效。在这种情况下,您将不得不使用trim()API或查看正则表达式。
答案 2 :(得分:0)
这应该是替换重复标签的通用方法
String line = "<b><b>hello</b></b>";
line = line.replaceAll("<(.*?)><\\1>", "<$1>");
System.out.println(line);
打印
<b>hello</b>