【问题标题】:Regex to remove html does not get rid of img tag正则表达式删除 html 并没有摆脱 img 标签
【发布时间】:2011-06-14 18:11:43
【问题描述】:

我正在使用正则表达式来删除 HTML 标签。我做类似的事情 - result.replaceAll("\<.>", "");

但是,它并不能帮助我摆脱 html 中的 img 标签。知道什么是这样做的好方法吗?

【问题讨论】:

  • 为了所有善良和理智的事物的爱,请不要使用正则表达式 HTML - 请使用解析器。
  • 您能否详细解释一下。我认为应该用你的正则表达式删除像&lt;img src="ping.png"&gt; 这样的东西。
  • 如果 html 包含类似&lt;span&gt;x &lt; 7&lt;/span&gt; 的内容会怎样?您不能使用正则表达式解析/处理 HTML。请参阅此答案以了解原因:stackoverflow.com/questions/1732348/…
  • @Marc B,这不是一个有效的示例,因为您需要使用 < 转义
  • @Mikola 其实有一个简单的反例:&lt;img src="ping.png" alt="&gt;&gt;&gt;ALT&gt;&gt;&gt;"/&gt;。将正则表达式用于 HTML 之类的东西确实不是一个好主意。

标签: java html-parsing


【解决方案1】:

如果您不能使用 HTML 解析器/清理器,那么我至少建议您使用 Pattern.DOTALL 标志来处理多行 HTML 块。考虑这样的代码:

String str = "123 <img \nsrc='ping.png'>abd foo";
Pattern pt = Pattern.compile("<.*?>", Pattern.DOTALL);
Matcher matcher = pt.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
System.out.println("Output: " + sb);

输出

Output: 123 abd foo

【讨论】:

  • 如果您在 Howard 发布的示例中尝试此操作会怎样? foo<.jpg>
  • @Mikola:即使我在回答中也建议不要使用正则表达式。我已经回答了这个问题,因为 OP 坚持使用简单的正则表达式。 HTML 是如此不规则,以至于任何正则表达式都无法处理这些边缘情况。
【解决方案2】:

要给出更具体的建议,请使用 JSoup(或 NekoHTML)将 HTML 解析为 Java 对象。

一旦你有了一个Document 对象,就可以轻松地遍历它来删除标签。这个cookbook recipe 展示了如何从 DOM 中获取属性和文本。

【讨论】:

  • 我之前看过 JSoup,但它非常庞大。我需要一个小型轻量级库或代码。
  • NekoHTML 是另一种选择,Thor 提到了 HTMLCleaner。
【解决方案3】:

另一个建议是HtmlCleaner

【讨论】:

    【解决方案4】:

    我只是重申其他人已经说过的话,但这一点不能被夸大:不要使用正则表达式来解析 HTML。 SO上有1000个类似的问题。使用适当的 HTML 解析器,它会让你的生活变得更加轻松,并且更加健壮和可靠。看看 Dom4j、Jericho、JSoup。请。

    【讨论】:

      【解决方案5】:

      所以,给你一段代码。 我使用http://htmlparser.sourceforge.net/ 来解析 HTML。它并不过分复杂且使用起来非常简单。

      基本上是这样的:

      import org.htmlparser.Parser;
      import org.htmlparser.util.NodeList;
      import org.htmlparser.util.ParserException;
      
          ...
      
          String html; /* read your HTML into variable 'html' */
          String result=null;
          ....
          try {
              Parser p = new Parser(html);
              NodeList nodes = p.parse(null);
              result = nodes.asString();
          } catch (ParserException e) {
              e.printStackTrace();
          }
      

      这将为您提供去掉标签的纯文本(但不会修复像 & 这样的替代品)。当然,你可以使用这个库做更多的事情,比如应用过滤器、访问者、迭代等等。

      【讨论】:

        【解决方案6】:

        改用 html 解析器。遍历对象,随心所欲地打印并获得最佳结果。

        【讨论】:

          【解决方案7】:

          我已经能够用下面的代码 sn-p 做到这一点。

          String htmlContent = values.get(position).getContentSnippet();
          String plainTextContent = htmlContent.replaceAll("<img .*?/>", "");
          

          我使用上面的正则表达式来清理我的 RSS 内容中的 img 标签。

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多
            热门标签