【问题标题】:Sanitize HTML string清理 HTML 字符串
【发布时间】:2015-01-04 16:04:26
【问题描述】:

我有一个类似的 HTML 字符串:

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

我想像&lt;b&gt;&lt;i&gt;&lt;u&gt; bold all in one &lt;/b&gt;&lt;/i&gt;&lt;/u&gt;一样清理html

我试过这个方法:webText = webText.replaceAll("(&lt;/?(?:b|i|u)&gt;)\\1+", "$1").replaceAll("&lt;/(b|i|u)&gt;&lt;\\1&gt;", "");

但是没有用。 html 仍然很笨拙。我该怎么做才能修复同样的问题?还有其他正则表达式或 JSON 方式吗?

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用 HTML 解析器。
  • @ajb 我考虑过 JSOUP 但无法正确实施。如果您对 JSOUP 或其他内容有一些想法.........您能发布一些代码来解决这个问题吗?
  • 我没有实际使用过。希望其他人对 JSOUP 或其他库有所了解。
  • @samgak 删除所有不希望出现的 html 标签

标签: java android html replaceall


【解决方案1】:

但是没有用。 html 仍然很笨拙。我该怎么做才能修补 相同?还有其他正则表达式或 JSON 方式吗?

正则表达式可能在这里有所帮助,但总的来说,如果事情变得复杂,它们作为 Html 解析器的服务效果不佳。 Jsoup 是一个很棒的 Html 库,我真的可以推荐它。

不幸的是,您的 html 仍然是有效的 html,因此解决方案很棘手。

最好从Jsoup documentation 开始,尤其是Selector syntax

这里有一些开始:

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);
}

结果:

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

如果你真的需要&lt;b&gt;&lt;i&gt;&lt;u&gt; bold all in one &lt;/b&gt;&lt;/i&gt;&lt;/u&gt;:

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); 

结果:

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

【讨论】:

    【解决方案2】:

    您可以尝试以下方法来删除不需要的 html 标签:

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

    【讨论】:

    • 这将删除所有有效或无效的html标签!
    猜你喜欢
    • 2011-05-02
    • 2011-06-22
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2022-01-06
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多