HTML中<script ...>....</script>标签的正则表达式?



    RT:求一个能匹配HTML代码中<script ...>....</script>标签的正则表达式???

    HTML代码可以看成是一个字符串,我试了好多帖子中的正则表达式,自己也写过,都有问题。比如对 搜狐 的首页进行匹配。
    我自己写的:
    String html = html .replaceAll("<script.*?</script>", "");  (不考虑HTML Code换行,我已经去掉换行了)

    老外帖子上找的:
    String html = html .replaceAll("<script(?:[^<]++|<(?!/script>))*+</script>", "");
    希望有哥们指点! 谢谢!!!


    要能匹配有嵌套HTML标签的,(可以不考虑换行问题),样本如下:

    <div>
      ...
      <script type='text/javascript' ...>
          ....
          document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>");
          ....
      </script>
      ...

      <script type='text/javascript' ...>
          ....
          document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>");
          ....
      </script>
      ....
    </div>
    

        var str='<div> '+  
         ' ... '+  
         ' <script type=\'text/javascript\' ...> '+  
            '  .... '+  
            '  document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>"); '+  
          '    .... '+  
         ' <\/script> '+  
        '  ... '+  
        '  <script type=\'text/javascript\' ...> '+  
        '      .... '+  
          '    document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>"); '+  
          '    .... '+  
        '  <\/script> '+  
        '  .... '+  
        '</div> ';  
        alert(str);  
        var reg=/<script[^>]*>.*(?=<\/script>)<\/script>/gi;  
        alert(str.replace(reg,''));  



    我用你这个还是不行,你不妨对www.sohu.com的首页过滤一遍试试....
    我套用的代码如下:
    input = input.replaceAll("<script[^>]*>.*(?=<\\/script>)<\\/script>", "");  没有效果。
    问题补充:
    xiaolongfeixiang 写道
    <script\\b.*?>*?</script>


    不行!! 试了
    htmlcode= htmlcode.replaceAll("<script\\b.*?>*?</script>", "");
   

        str=str.replace(/&lt;/g,'<');  
                str=str.replace(/&gt;/g,'>');  
        var reg=/<script[^>]*>.*(?=<\/script>)<\/script>/gi;  
        alert(str.replace(reg,''));  


    怀疑是HTML转义的问题
    我一般都用replace();js不像java 不知道有没replaceAll这玩意
    后面带的g就是all的意思


    呵呵,JS还是Java正则表达式,没关系,我看的懂,其实他们都是一样的。我就想要获得一个比较完美的能匹配<script/>标签的正则表达式。
    问题补充:
    shinestarwang 写道
    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher(html);
    return m.replaceAll("");
    记得给分哦!


    "<script[^>]*?>.*?<\\/script>"
    我想这个正则表达式应该是正确的,比我自己写的完善。至于为什么一直去除JS没有去除干净,我还是找不出原因!
    问题补充:
    shinestarwang 写道
    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher(html);
    return m.replaceAll("");
    记得给分哦!



    现在突然明白了,为什么会JS去除不干净了,呵呵,原来是大家的JS正则表达式里,都没有考虑JS嵌套!!!比如:
    <script ...>
       ....
       document.writeln("<script ....>...</script>");
       ....
    </script>
    当匹配第一个</script>后,就完成了匹配。结果就留下了后面这段!!!
    现在我自己想了一个方式:
    0. </script>全换成<script>,因为<script/>标签一定是成对出现的。
    1. 然后用"<script[^>]*?>.*?<script[^>]*?>"去匹配。
    这样就应该能搞定JS残留问题。呵呵
    代码如下(Java):
    //去除CSS、Javascript代码  )
    input = input.replaceAll("/(style|script)", "stylescript");
    input = input.replaceAll("<stylescript[^>]*?>.*?<stylescript[^>]*?>", "");
    问题补充:
 

        str=str.replace(/&lt;/g,'<');     
        str=str.replace(/&gt;/g,'>');     
        var reg=/<script[^>]*>(.|\n)*?(?=<\/script>)<\/script>/gi;     
        alert(str.replace(reg,''));  


    

    其实不是换行的问题,是<script/>标签嵌套的问题!导致了去除不干净@!
    问题补充:
    shinestarwang 写道
    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher(html);
    return m.replaceAll("");
    记得给分哦!



    最终解决方案(Java):
    input = input.replaceAll("<script(?:[^<]++|<(?!/script>))*+</script>", "<script>");
    while(input.contains("</script>")){
         input = input.replaceAll("<script(?:[^<]++|<(?!/script>))*+</script>", "<script>");
    }

 
        str=str.replace(/&lt;/g,'<');  
                str=str.replace(/&gt;/g,'>');  
        var reg=/<script[^>]*>.*(?=<\/script>)<\/script>/gi;  
        alert(str.replace(reg,''));  


    怀疑是HTML转义的问题
    我一般都用replace();js不像java 不知道有没replaceAll这玩意
    后面带的g就是all的意思

 
    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher("要判断的字符串<script type= >3433</script>");

    try{
    if(m.start()>-1){
    System.out.println("存在");
    }
    }catch(IllegalStateException e){
    if(m.matches()){
    System.out.println("存在");
    }else{
    System.out.println("不存在");
    }
    }


    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher("你要判断的字符串如:<script language=vbscript >3333333333</script>");
    return m.replaceAll("");
    2010年4月10日 17:04
    shinestarwang shinestarwang
 

    Pattern p = Pattern.compile("(?is)<script[^>]*?>.*?<\\/script>");
    Matcher m = p.matcher(html);
    return m.replaceAll("");
   
        <script>  
          
        var str = "<div>\n  ...  <script type=\'text/javascript\' ...>\n      ....\n      document.writeln(\'<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>\');\n";  
        str = str + "      ....\n  \<\/script\>\n  ...\n  <script type=\'text/javascript\' ...>\n      ....\n";  
        str = str + "document.writeln(\'<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>\');\n      ....\n  \<\/script\>\n  ....\n\<\/div\>\n";  
        alert(str);    
        var reg = /<\s*script.*>(\s*|\S*)*<\/\s*script\s*>/gim;  
          
        alert(str.replace(reg,''));    
          
        </script>  

   

    我有一个API文档 你可以看看 里边有正则表达式的详细介绍
    [url]http://doc.51windows.net/jscript5/?url=/jscript5/html/jsoprinstanceof.htm
    [/url]
 
        str=str.replace(/&lt;/g,'<');     
        str=str.replace(/&gt;/g,'>');     
        var reg=/<script[^>]*>(.|\n)*?(?=<\/script>)<\/script>/gi;     
        alert(str.replace(reg,''));  


 

    少写了个点
    <script\\b.*?>.*?</script>
    Java代码  收藏代码

        public static void main(String[] args) {  
            String str ="<div>...<script type='text/javascript' ...>...."+  
                 "document.writeln(\"<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>\");"+  
                  "....</script> ..."+  
                  "<script type='text/javascript' ...>"+  
                  "....document.writeln(\"<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>\");"+  
                  "....</script>....</div>";  
              
            str = str.replaceAll("<script\\b.*?>.*?</script>", "");  
              
            System.out.println(str);  
          
        }  


    你不会是说要像java这样的正则吧 抱歉 我没搞过java的正则
 

        var str='<div> '+  
         ' ... '+  
         ' <script type=\'text/javascript\' ...> '+  
            '  .... '+  
            '  document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>"); '+  
          '    .... '+  
         ' <\/script> '+  
        '  ... '+  
        '  <script type=\'text/javascript\' ...> '+  
        '      .... '+  
          '    document.writeln("<h1>在JS代码里也可能会嵌套HTML标签等等,各种符合语法的嵌套</h1>"); '+  
          '    .... '+  
        '  <\/script> '+  
        '  .... '+  
        '</div> ';  
        alert(str);  
        var reg=/<script[^>]*>.*(?=<\/script>)<\/script>/gi;  
        alert(str.replace(reg,'')); 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import retext = """<table class="table table-bordered table-condensed"> <thead> <tr> <th>期号</th> <th colspan="11">开奖号码</th> <th>总和</th> </tr> </thead> <tbody> <tr class="new"> <td>2023058</td> <td>10 17 22 26 30 33 + 11</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>×</td> <td>0</td> </tr> <tr class="new"> <td>2023059</td> <td></td> <td>24</td> <td>10</td> <td>26</td> <td>31</td> <td>12</td> <td>33</td> <td>24</td> <td>08</td> <td>31</td> <td>24</td> <td></td> </tr> <tr> <td colspan="2">正确次数</td> <td>4</td> <td>3</td> <td>7</td> <td>2</td> <td>9</td> <td>3</td> <td>4</td> <td>5</td> <td>3</td> <td>6</td> <td></td> </tr> <tr> <td colspan="2">错误次数</td> <td>16</td> <td>17</td> <td>13</td> <td>18</td> <td>11</td> <td>17</td> <td>16</td> <td>15</td> <td>17</td> <td>14</td> <td></td> </tr> <tr> <td colspan="2">当前连对</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td></td> </tr> <tr> <td colspan="2">当前连错</td> <td>1</td> <td>4</td> <td>2</td> <td>4</td> <td>1</td> <td>7</td> <td>1</td> <td>2</td> <td>13</td> <td>3</td> <td></td> </tr> <tr> <td colspan="2">最大连对</td> <td>2</td> <td>1</td> <td>3</td> <td>1</td> <td>2</td> <td>1</td> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td></td> </tr> <tr> <td colspan="2">最大连错</td> <td>9</td> <td>7</td> <td>4</td> <td>12</td> <td>3</td> <td>7</td> <td>7</td> <td>4</td> <td>13</td> <td>3</td> <td></td> </tr> </table> </div> </div> </div> <script type="text/javascript" src="https://img.78500.cn/mobile/iscroll.js"></script> <script type="text/javascript"> var wrapper; function loaded() { wrapper = new iScroll("wrapper", { vScrollbar: false, hScrollbar: false, zoom: true, zoomMin: 0.5, zoomMax: 1 }); } document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); document.addEventListener('DOMContentLoaded', loaded, false); </script></body> </html>"""pattern = re.compile(r'<tr class="new">(.*?)</tr>', re.S)matches = pattern.findall(text)for match in matches: print(match) 没有匹配上 且没有匹配数字
05-25

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值