Java 方法不会替换所有标记
我有一个包含2个方法的类,其中一个生成一个与禁止的html标记匹配的正则表达式,另一个扫描给定的输入字符串以查找这些标记:Java 方法不会替换所有标记,java,regex,Java,Regex,我有一个包含2个方法的类,其中一个生成一个与禁止的html标记匹配的正则表达式,另一个扫描给定的输入字符串以查找这些标记: private Pattern pattern; private List<Pattern> generatePatterns(String[] blacklist) { List<Pattern> deleteList = new ArrayList<Pattern>(); for (String s : blackl
private Pattern pattern;
private List<Pattern> generatePatterns(String[] blacklist)
{
List<Pattern> deleteList = new ArrayList<Pattern>();
for (String s : blacklist)
{
pattern = Pattern.compile("(?i)<((\\s|/)|(\\s,/))*?" + s + ".*?>");
deleteList.add(pattern);
}
return deleteList;
}
public String cleanHTML(String unsafe, String[] blacklist)
{
try
{
List<Pattern> gp = generatePatterns(blacklist);
BufferedReader br = new BufferedReader(new StringReader(unsafe));
String s;
StringBuilder builder = new StringBuilder();
while ((s = br.readLine()) != null)
{
builder.append(s);
}
for (Pattern p : gp)
{
Matcher mat = p.matcher(builder.toString());
if(mat.find()){
builder.replace(mat.start(), mat.end(), "");
}
}
return builder.toString();
} catch (Exception e)
{
...
}
}
私有模式;
私有列表生成器模式(字符串[]黑名单)
{
List deleteList=new ArrayList();
用于(字符串s:黑名单)
{
pattern=pattern.compile(“(?i)”);
deleteList.add(模式);
}
返回删除列表;
}
公共字符串cleanHTML(字符串不安全,字符串[]黑名单)
{
尝试
{
列表gp=生成模式(黑名单);
BufferedReader br=新BufferedReader(新StringReader(不安全));
字符串s;
StringBuilder=新的StringBuilder();
而((s=br.readLine())!=null)
{
建造商。附加;
}
用于(模式p:gp)
{
Matcher mat=p.Matcher(builder.toString());
if(mat.find()){
替换(mat.start(),mat.end(),“”);
}
}
返回builder.toString();
}捕获(例外e)
{
...
}
}
我已使用此输入对其进行了测试:
String[] blacklist = new String[]
{ "img", "a", "script", "svg", "style", "link", "meta", "noscript", "code", "span", "div", "iframe", "object", "video", "source", "map", "area",
"form", "onclick", "button" };
String unsafe = "<p class='p1'>paragraph</p><img></img><Img><Script><Svg><a href><style><link><meta><noscript><code>"
+ "<span><div><iframe><object><video><audio><source><map><area><form><onclick><button>"
+ "< no html > <A href='#'>Link</A> <![CDATA[<sender>John Doe</sender>]]><a link=''>other link</a>";
String[]黑名单=新字符串[]
{“img”,“a”,“script”,“svg”,“style”,“link”,“meta”,“noscript”,“code”,“span”,“div”,“iframe”,“object”,“video”,“source”,“map”,“area”,
“窗体”、“onclick”、“按钮”};
String unsafe=“段落
John Doe]]>John Doe]]>otherlink
因此,它基本上匹配了大多数黑名单上的标签,但不是全部。出于某种原因,它只替换了3个标签中的1个。我很确定,这与我的正则表达式有关,尽管它以前工作得很完美,但现在它不再匹配结束标签(例如),出于某种原因,它也不会替换和标签
如果我这样更改方法:
public String cleanHTML(String unsafe,String[] taglist){
List<Pattern> gp = generatePatterns(taglist);
for (Pattern p : gp)
{
Matcher mat = p.matcher(unsafe);
unsafe = ((mat.find()) ? mat.replaceAll("") : unsafe);
}
return unsafe;
}
publicstringcleanhtml(字符串不安全,字符串[]标记列表){
列表gp=生成模式(标记列表);
用于(模式p:gp)
{
Matcher mat=p.Matcher(不安全);
不安全=((mat.find())?mat.replaceAll(“”:不安全);
}
不安全返回;
}
它可以工作,可能与缓冲字符串有关?尽管它取代了大多数标记。让我发疯。永远不要使用正则表达式解析HTML,HTML结构可能会变得非常复杂,要实现一个完美的正则表达式来处理HTML并不容易。我建议使用类似的HTML解析器库 您可以像这样删除标记
Document document = Jsoup.parse(html);
document.select("img").unwrap(); //removes all <img> tags
document.select("p, a, img").unwrap(); //remove multiple tags
documentdocument=Jsoup.parse(html);
document.select(“img”).unwrap();//删除所有标记
document.select(“p,a,img”).unwrap();//删除多个标记
请参阅[为什么不应该使用正则表达式解析HTML]()谢谢你的提示。我已经听说过这个库。问题是我不能使用外部库,因为这个作业是为了了解正则表达式
Document document = Jsoup.parse(html);
document.select("img").unwrap(); //removes all <img> tags
document.select("p, a, img").unwrap(); //remove multiple tags