Java 删除字符串中的特定HTML标记

Java 删除字符串中的特定HTML标记,java,regex,Java,Regex,我想删除字符串中的HTML标记(在数组中定义)。我的方法: public String cleanHTML(String unsafe,String[] blacklist){ String safe = ""; for(String s:blacklist){ safe =unsafe.replaceAll("\\<.{0,1}"+s+".*?>", ""); } return safe;} publicstringcleanhtml(字符串

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

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

   return safe;}
publicstringcleanhtml(字符串不安全,字符串[]黑名单){
字符串safe=“”;
用于(字符串s:黑名单){
safe=unsafe.replaceAll(“\\”,“”);
}
安全返回;}
为了测试我的功能,我使用以下主要方法:

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

}
publicstaticvoidmain(字符串a[]){
StringParser sp=新的StringParser();
字符串[]黑名单=新字符串[]{“img”,“a”};
System.out.println(sp.cleanHTML(“

段落

John Doe]]>另一个链接
正如你所看到的,它只替换了“另一个链接”部分。因此我基本上有两个问题:1)如何让我的正则表达式替换每个,而不管它是小写还是大写;2)如何让我的代码删除每个列入黑名单的标记,而不仅仅是数组中的最后一个

提前谢谢

1.)如何让我的正则表达式替换每个
,而不管它是小写还是大写

正如其他人已经说过的,最好使用一些HTML解析器/清理器,因为HTML不太适合正则表达式

但是,如果您仍然希望使用正则表达式并做出一些假设(例如HTML格式良好),则可能需要使用类似以下表达式的内容:

(?i)</?(?:p|img|a).*?>
当然,如果有一个大的黑名单,您可能需要使用
StringBuffer

另一个选项,正如我上面已经演示过的,可能是添加所有这些标记作为替代选项,即
(?:a | img | p | br)
等,但如果列表太大,也可能会降低性能

1.)如何让我的正则表达式替换每个
,而不管它是小写还是大写

正如其他人已经说过的,最好使用一些HTML解析器/清理器,因为HTML不太适合正则表达式

但是,如果您仍然希望使用正则表达式并做出一些假设(例如HTML格式良好),则可能需要使用类似以下表达式的内容:

(?i)</?(?:p|img|a).*?>
当然,如果有一个大的黑名单,您可能需要使用
StringBuffer


另一个选项,正如我上面已经演示过的,可能是添加所有这些标记作为替代选项,即
(?:a | img | p | br)
等等,但是如果列表太大,它也可能会降低性能。

最好使用html解析器而不是正则表达式。
不安全。replaceAll
不会修改
不安全的
。哦,我想我应该集中一点精力。谢谢。最好使用html解析器而不是正则表达式。
不安全。replaceAll
不会修改
不安全的
哦,是的ss我应该更专注一点。谢谢。谢谢你的回答。当有25-30个被禁止的标签时,StringBuffer会提高性能吗?@gruntswilldie你需要对其进行分析,但不是创建25-30个中间字符串对象,而是对单个
StringBuffer
进行操作,这至少会节省一些内存,尤其是如果输入字符串稍大一些,我想我会在StringBuffer上尝试我的正则表达式,谢谢。谢谢你的回答。StringBuffer会在有~25-30个被禁止的标记时提高性能吗?@gruntswilldie你需要分析它,但不是创建25-30个中间字符串对象,而是在单个
Str上操作ingBuffer
至少可以节省一些内存,特别是如果输入字符串稍大一些。我想我要在StringBuffer上试试我的正则表达式,谢谢。
String intermediate = unsafe;
for(String s:blacklist){
  intermediate = intermediate.replaceAll("\\<.{0,1}"+s+".*?>", "");
}
String safe = intermediate; //maybe do some additional checks here