Sanitize HTML string

2019-09-11 06:08发布

I have an HTML sting like:

<p dir="ltr"><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u>bold</u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u> </u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u>all</u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u> </u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u>in</u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u> </u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i><i><u><b><i><u><b><i><u><b><i><u><b><i><u>one</u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></p>

I want to sanitize the html like <b><i><u> bold all in one </b></i></u>

I tried this method: webText = webText.replaceAll("(</?(?:b|i|u)>)\\1+", "$1").replaceAll("</(b|i|u)><\\1>", "");

But it is of no use. The html remains clumsy. What should I do to mend the same? Is there any other Regex or JSON way?

2条回答
祖国的老花朵
2楼-- · 2019-09-11 06:32

You could try below method to remove unwanted html tags:

public String stripHtml(String html) 
{
    return Html.fromHtml(html).toString();
}
查看更多
别忘想泡老子
3楼-- · 2019-09-11 06:44

But it is of no use. The html remains clumsy. What should I do to mend the same? Is there any other Regex or JSON way?

Regex may help here, but in general they serve not very well as Html parser if things get complex. Jsoup is a great Html library, and i really can recommend it.

Unfortunately your html is still valid html, so the solution is tricky.

Best you start with the Jsoup documentation, especially the one of it's Selector syntax.

Here's something for starting:

final String html = ... // your html from above

// Parse the html string into a document
Document doc = Jsoup.parse(html, "", Parser.xmlParser());

/*
 * Select all elements, which ...
 * 
 *   (a) have a text (= at least not empty)
 *   (b) has no childs it's own
 * 
 * Iterate over those found and print them.
 */
for( Element element : doc.select("*:matches(^..+?$):not(:has(*))") )
{
    System.out.println(element);
}

Result:

<u>bold</u>
<u>all</u>
<u>in</u>
<u>one</u>

If you need literally <b><i><u> bold all in one </b></i></u>:

final String html = ... // your html from above

// As above
Document doc = Jsoup.parse(html, "", Parser.xmlParser());

// All text of the document
String text = doc.text();

// Create an element and it's childs
Element element = new Element(Tag.valueOf("b"), "");
element.appendElement("i").appendElement("u").text(text);

System.out.println(element); 

Result:

<b><i><u>bold all in one</u></i></b>
查看更多
登录 后发表回答