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(/</g,'<');
str=str.replace(/>/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(/</g,'<');
str=str.replace(/>/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(/</g,'<');
str=str.replace(/>/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(/</g,'<');
str=str.replace(/>/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,''));