从字符串中删除斜体和粗体HTML标记?

4

除了以下方法,有没有更安全的方法来删除加粗和斜体?

        String text = "<b>Remove <i>bold</i> and italics</b>";
        System.out.println(text);
        text = text.replaceAll("\\<.*?\\>", ""); //remove all but only want to remove b and i?
        System.out.println(text);

此外,如果我想包含其他标签,如“strong”或“em”,并允许区分大小写(“b”与“B”等),是否有更具可扩展性的解决方案?


1
更安全的方法绝对不是使用正则表达式。为了安全起见,请使用HTM/XML解析器。顺便说一句,您的正则表达式正在删除所有HTML标记,而不仅仅是粗体、斜体等。 - anubhava
@anubhava:在他的情况下,我认为可以使用正则表达式。请参见http://www.rubular.com/r/LBFMYx2Sso - Johnny
这仍然有些不安全,只有在输入的HTML格式良好时才是正确的。如果HTML中缺少闭合>怎么办? - anubhava
3个回答

8
您可以使用以下正则表达式:
<\/?[bi]> 演示链接:DEMO 代码如下:
    String text = "<b>Remove <i>bold</i> and italics</b>"; 
    text = text.replaceAll("<\\/?[bi]>", "");  
    System.out.println(text);

输出

Remove bold and italics

如果您想进行不区分大小写的匹配,则可以使用相应的标志 (?i)。关于此标志的详细解释,请参考此处解释: 如上图所示,正则表达式中的 (?i) 标志表示对大小写不敏感。如果您希望在搜索或替换时忽略字符串的大小写,则可以在正则表达式中加入此标志。

1
是的,我喜欢这个!特别是考虑到简单的输入,它很明确和简单。感谢简洁而精确的答案总结!=) - genxgeek
以下代码(去掉 \ 后可正常工作):text = text.replaceAll("</?[bip]>", ""); - genxgeek
@JaJ: 是的,你也可以这样使用。在一些语言(不同的正则表达式)中,“/”的含义是不同的,这就是为什么我也跳过了它。 - Sujith PS

2
您可以使用JsoupWhitespace进行清理。 Whitespace可扩展以包括要省略的属性。

根据此处的javadoc:

白名单定义了允许通过清理程序的HTML(元素和属性)。其他所有内容都将被删除。…

如果您需要允许更多内容通过(请小心!),请使用以下方法调整基本白名单:

  • addTags(java.lang.String...)
  • addAttributes(java.lang.String, java.lang.String...)
  • addEnforcedAttribute(java.lang.String, java.lang.String, java.lang.String)
  • addProtocols(java.lang.String, java.lang.String, java.lang.String...)

在您的代码中:

String text = "<b>Remove <i>bold</i> and italics</b>";
        System.out.println(text);
        String doc =  Jsoup.clean(text, new Whitelist());
        System.out.println(doc);

提供:

<b>Remove <em>bold</i> and italics</b>
Remove bold and italics

0

不要使用正则表达式来解析HTML,使用像 JSoup 库这样的东西会让你的生活更轻松,并使它更具可扩展性。这里是一些示例代码

   Document doc = Jsoup.parse(content);
   Elements elements = doc.getElementsByTag("b");
   for (Element pre : elements) {
             pre.remove();
    }

要取消斜体,请将"b"替换为"i"

更新

我尚未测试以下代码,但它可能有效。

JSoup允许像css选择器一样进行选择,因此类似于doc.select("strong, em, b, i");的东西应该返回Elements

文档链接


谢谢,有没有某种白名单可以让我指定“b”、“i”、“em”、“strong”等标签,并进行一次替换?我该如何一次性替换它们,而不是基于每个getElementsByTag()指定标签类型进行n次迭代? - genxgeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接