我想删除字符串中的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.)如何让我的代码删除每个列入黑名单的标签,而不仅仅是数组中的最后一个?
提前致谢。
答案 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)
等,但如果该列表变得太大,则可能也会降低性能。