删除String中的特定HTML标记

时间:2015-01-20 13:21:14

标签: java regex

我想删除字符串中的HTML标记(在数组中定义)。我的方法:

public String cleanHTML(String unsafe,String[] blacklist){
   String safe = "";
   for(String s:blacklist){
      safe =unsafe.replaceAll("\\<.{0,1}"+s+".*?>", "");
   }

   return safe;}

为了测试我的功能,我使用以下主要方法:

public static void main(String a[]){
    StringParser sp = new StringParser();
    String[] blacklist = new String[]{"img","a"};

    System.out.println( sp.cleanHTML("<p class='p1'>paragraph</p><img></img>< this is not html > <A HREF='#'>Link</A><a link=''>another link</a> <![CDATA[<sender>John Doe</sender>]]>",blacklist));

}

输出:

<p class='p1'>paragraph</p><img></img>< this is not html > <A href='#'>Link</A> <![CDATA[<sender>John Doe</sender>]]>another link

正如您所看到的,它只取代了另一个链接&#34;所以我基本上有两个问题:1。)我怎样才能让我的正则表达式替换每个&lt; a&gt;无论是小写还是大写,以及2.)如何让我的代码删除每个列入黑名单的标签,而不仅仅是数组中的最后一个?

提前致谢。

1 个答案:

答案 0 :(得分:4)

  

1.)如何让我的正则表达式替换每个&lt; a&gt;无论是小写还是大写

正如其他人所说,最好使用一些HTML解析器/清除器,因为HTML不能很好地适应正则表达式。

但是,如果你仍然想使用正则表达式并做出一些假设(例如HTML格式正确),你可能想要使用类似这样的表达式:

(?i)</?(?:p|img|a).*?>

表达式不区分大小写((?i)),.*会使表达式尽可能少地匹配。但是,如果属性包含一个右括号,例如, <a href="whatever" title=">>>">无法正确匹配。您也可以尝试使用匹配的引号对,但正如您所看到的,表达式变得越来越复杂。这就是为什么正则表达式不适合HTML的一个原因。

  

如何让我的代码删除每个列入黑名单的标签,而不仅仅是数组中的最后一个?

您需要对中间结果而不是初始参数值进行操作:

String intermediate = unsafe;
for(String s:blacklist){
  intermediate = intermediate.replaceAll("\\<.{0,1}"+s+".*?>", "");
}
String safe = intermediate; //maybe do some additional checks here

当然,如果有一个大的黑名单,您可能希望改为使用StringBuffer

如上所述,另一个选项可能是将所有这些标记添加为替换选项,即(?:a|img|p|br)等,但如果该列表变得太大,则可能也会降低性能。