Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法不会替换所有标记_Java_Regex - Fatal编程技术网

Java 方法不会替换所有标记

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

我有一个包含2个方法的类,其中一个生成一个与禁止的html标记匹配的正则表达式,另一个扫描给定的输入字符串以查找这些标记:

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