我想实现对页面里的css和js压缩,
想通过正则查找页面中的style和script标签
捕获style和script标签里的内容并替换
请问下用Java要怎么写?
下面是我用js写的var cssCompressor=function(css){return css+'/*compressed*/';}
var jsCompressor=function(js){return js.replace(/^\s+|\s+$/g,'');}
var html="<style type='text/css'>body{margin:0;padding:0;}</style><script>          alert('test')</"+"script>";
var regCss=/<style([^>]*)>([\s\S]+?)<\/style>/g,regJS=/<script([^>]*)>([\s\S]+?)<\/script>/g
html=html.replace(regCss,function($,$1,$2){
    return "<style"+$1+">"+cssCompressor($2)+"</style>";
});
html=html.replace(regJS,function($,$1,$2){
    return "<script"+$1+">"+jsCompressor($2)+"</"+"script>";
});
alert(html);ps:上面这种写法如果script标签中有script标签字符串应该不会匹配吧?
ps2:如果可能,希望不匹配textarea中的script标签

解决方案 »

  1.   

    sf 兄弟 砸用java来了?
      

  2.   

    杯具,java版没人,自己写出来了
    谁帮忙写下不匹配textarea中的script的正则啊String html="<html>\n<head>\n<style type='text/css'>body{margin:0;padding:0;}</style>\n" +
    "<style type='text/css'>body{margin:0;padding:1;}</style>" +
    "</head>\n<body><div>\n内容</div></body>\n<script>    \n      alert('test')</script>\n</html>";
    Pattern regCss=Pattern.compile("(?is)(.*?<style[^>]*>)(.+?)</style>"),
    regJS=Pattern.compile("(?is)(.*?<script[^>]*>)(.+?)</script>");

    Matcher mat=regCss.matcher(html);
    StringBuffer buf=new StringBuffer(),res=new StringBuffer();
    int end=0;
    while(mat.find()){
    buf.append(mat.group(1));
    buf.append(mat.group(2));
    buf.append("/*css compressed*/</style>");
    end=mat.end();
    }
    buf.append(html.substring(end));
    mat=regJS.matcher(buf.toString());
    while(mat.find()){
    res.append(mat.group(1));
    res.append(mat.group(2));
    res.append("/*compressed*/</script>");
    end=mat.end();
    }
    res.append(buf.substring(end));
    System.out.println(res.toString());
      

  3.   

    会正则的人呢?要不实现不匹配有src属性的script也可以
      

  4.   

    现在问题
    1.希望不匹配js代码中字符串中的</style>
    2.如果js有src属性则不匹配
    3.textarea中的script不匹配String html="<html>\n<head>\n<style type='text/css'>body{margin:0;padding:0;}</style>\n" +
    "<style type='text/css'>body{margin:0;padding:1;}</style>" +
    "</head>\n<body><div>\n内容</div>" +
    "<textarea><script>     \n     alert('test')</script></textarea></body>\n" +
    "<script>      \n    alert('test<style>body,</style>')</script>\n<script type=\"text/javascript\" " +
    "src=\"http://www.extjs.com/deploy/ext-3.0.0/docs/resources/ext-base.js\"> </script>\n" +
    "<script type=\"text/javascript\" src=\"http://www.extjs.com/deploy/ext-3.0.0/docs/resources/ext-all.js\"></script>\n" +
    "<scripT type=\"text/javascript\" src=\"sign.js\"></script>\n</html>";
    Pattern reg=Pattern.compile("(?is)(.*?<(style|script)[^>]*>)(.+?)</(?:style|script)>");

    Matcher mat=reg.matcher(html);
    StringBuffer buf=new StringBuffer();
    int end=0;
    String label=null;
    while(mat.find()){
    buf.append(mat.group(1));
    label=mat.group(2);
    if(label.equalsIgnoreCase("script")){
    buf.append(mat.group(3).trim()+"/*js compressed*/");
    }else {
    buf.append(mat.group(3)+"/*css compressed*/");
    }
    buf.append("</"+label+">");
    end=mat.end();
    }
    buf.append(html.substring(end));
    System.out.println(buf.toString());
      

  5.   


    查找字符串里的<style和<script标签,取出里面的内容,替换成压缩(这个不用管)的之后的,
    这里可以理解为给页面所有的style和script标签里内容添加一句话,
    这是我现在的写法Pattern reg=Pattern.compile("(?is)(.*?<(style|script)[^>]*>)(.*?)</\\2>");

    Matcher mat=reg.matcher(html);
    StringBuffer buf=new StringBuffer();
    int end=0;
    String label=null,sMatch=null;
    while(mat.find()){
    end=mat.end();
    sMatch=mat.group(3).trim();
    if(sMatch.isEmpty()){
    buf.append(mat.group());
    continue;
    }
    label=mat.group(2);
    buf.append(mat.group(1));
    if(label.equalsIgnoreCase("script")){
    buf.append(sMatch+"/*js compressed*/");
    }else {
    buf.append(sMatch+"/*css compressed*/");
    }
    buf.append("</"+label+">");

    }
    buf.append(html.substring(end));问题
    1.我希望不匹配有src属性的标签
    2.如果可能希望可以不匹配textarea里的内容
    谢谢,
      

  6.   

    上面就有啊,把6楼html那个字符串放到9楼就可以运行了