Sanitize HTML string

2019-09-11 06:15发布

问题:

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?

回答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?

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>


回答2:

You could try below method to remove unwanted html tags:

public String stripHtml(String html) 
{
    return Html.fromHtml(html).toString();
}