Java删除多余的html标记

时间:2015-10-25 03:25:07

标签: java html

说我有像这样的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>

3 个答案:

答案 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>