【问题标题】:Removing font color from html string从 html 字符串中删除字体颜色
【发布时间】:2015-03-07 10:23:47
【问题描述】:

我有一个简单的 html 字符串,例如:

<p dir="ltr"><a href="xxxx://viewstudent/MeTdMw9Ndj" class="favourite" data="MeTdMw9Ndj"><font color="#009a49">Good evening</font></a></p>

我希望输出是:

 <p dir="ltr"><a href="xxxx://viewstudent/MeTdMw9Ndj" class="favourite" data="MeTdMw9Ndj">Good evening</a></p>

应该怎么做才能达到同样的效果?

我的尝试:

//removing font tags
        Document doc = Jsoup.parse(webText);
        Elements elements = doc.select("font");

        //remove all 'font'-tags
        elements.remove();
        webText = doc.toString();

【问题讨论】:

  • @nhahtdh 我可以使用任何,我的 JSOUP 方式没有提供所需的输出,所以我尝试了正则表达式方式。
  • @kittu88:您可以使用 Jsoup 查看我的答案。它并不比正则表达式的答案复杂。
  • @nhahtdh 我会试一试的。谢谢!
  • 检查我的更新它填补了这个案例&lt;FONT \n color="red" &gt; test &lt;/font&gt;

标签: java html regex jsoup


【解决方案1】:

通过正则表达式:搜索模式(?i)&lt;\\/?font[^&gt;]*&gt; 并替换为""

        String cleanstr = "<p dir='ltr'><a href='xxxx://viewstudent/MeTdMw9Ndj' class='favourite' data='MeTdMw9Ndj'><font color='#009a49'>Good evening</font></a></p>";
        cleanstr = cleanstr.replaceAll("(?i)<\\/?font[^>]*>", "");
        System.out.println(cleanstr);

Live demo

【讨论】:

    【解决方案2】:

    如果你想使用正则表达式,你可以使用:&lt;\\/{0,1}font.*?&gt;

    String html = "<p dir='ltr'><a href='xxxx://viewstudent/MeTdMw9Ndj' class='favourite' 
                    data='MeTdMw9Ndj'><font color='#009a49'>Good evening</font></a></p>";
    html = html.replaceAll("<\\/{0,1}font.*?>","");
    System.out.println(html);
    

    输出:

    <p dir='ltr'><a href='xxxx://viewstudent/MeTdMw9Ndj' class='favourite'
     data='MeTdMw9Ndj'>Good evening</a></p>
    

    查看demo here

    【讨论】:

    • 所以,因为我使用正则表达式而被否决?显然OP将regex标签放在问题中
    • 用正则表达式处理 HTML 从来都不是一个好主意。 OP 最终使用了 Jsoup,因此有更多的理由远离正则表达式解决方案。
    • @nhahtdh 好的,不确定为什么它不是一个好主意。但由于 OP 对这个解决方案没问题,那么我就把这个答案留在这里:)
    • 它不是替换uppercase标签..和newline tag&lt;FONT \n color="red" &gt; test &lt;/font&gt;
    【解决方案3】:

    你只需要把font节点的所有子节点都取Node.childNodes(),并将其追加到索引font节点之后Element.insertChildren(int index, Collection&lt;? extends Node&gt; children)的父节点(可以用Node.siblingIndex检索)。

    Document doc = Jsoup.parse(webText);
    Elements elements = doc.select("font");
    
    for (Element e: elements) {
        e.parent().insertChildren(e.siblingIndex(), e.childNodes());
    }
    
    elements.remove();
    webText = doc.toString();
    

    我已经在 J​​ava 7 上测试了代码,使用了不同版本的 Jsoup - 1.7.2、1.7.3 和 1.8.1。它们都产生了预期的结果。

    这是我的测试代码:

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class SO27854788 {
        public static void main(String[] args) {
            Document doc = Jsoup.parse("<font color=\"#009a49\">Good evening <font color=\"#009a49\">Good evening</font> <font color=\"#009a49\">Good evening <font color=\"#009a49\">Good evening</font></font> <font color=\"#009a49\">Good evening</font></font><p dir=\"ltr\"><a href=\"xxxx://viewstudent/MeTdMw9Ndj\" class=\"favourite\" data=\"MeTdMw9Ndj\"><font color=\"#009a49\">Good evening</font></a></p><p dir=\"ltr\"><a href=\"xxxx://viewstudent/MeTdMw9Ndj\" class=\"favourite\" data=\"MeTdMw9Ndj\"><font color=\"#009a49\">Good evening. Here are some <span>more tags inside</span></font></a></p>");
            Elements elements = doc.select("font");
    
            for (Element e: elements) {
                e.parent().insertChildren(e.siblingIndex(), e.childNodes());
            }
    
            elements.remove();
    
            System.out.println(doc.toString());
        }
    }
    

    还有输出:

    <html>
     <head></head>
     <body>
      Good evening Good evening Good evening Good evening Good evening
      <p dir="ltr"><a href="xxxx://viewstudent/MeTdMw9Ndj" class="favourite" data="MeTdMw9Ndj">Good evening</a></p>
      <p dir="ltr"><a href="xxxx://viewstudent/MeTdMw9Ndj" class="favourite" data="MeTdMw9Ndj">Good evening. Here are some <span>more tags inside</span></a></p>
     </body>
    </html>
    

    【讨论】:

    • 输出: null
    • @kittu88: 你用的是哪个版本的JSoup?
    • 我正在使用的 1.7.3 jar 文件
    • @kittu88:我使用从 1.7.2 到 1.8.1 的 Jsoup 版本测试了我的 sn-p。它们都在 Java 6 和 Java 7 上产生了预期的结果。
    • @kittu88:不知道你的问题是什么,但是我已经添加了我在回答之前写的测试用例。
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2014-10-04
    • 2016-07-21
    相关资源
    最近更新 更多