里面的test=sd也会被匹配。三是如果属性原来使用了单引号,会被再包上一层双引号……
来看看LeXRus前辈的新正则替换方法:
str=str.replace(/(?!<\w+)(\s+\w+)\s*=\s*([^>\"\s]+)(?=[^>]*>)/ig,'$1="$2"')
.replace(/\"\'([^\'\"]+)\'\"/ig,'\"$1\"'); 先来看第一个正则:
/ (\s+\w+)\s*=\s*([^>"\s]+)(?=[^>]*>)/ig 结尾新添的(?=[^>]*>)意在解决普通文本中有等号被误识别为属性的问题:
<a href=xxx target=yyy title = asdfasf> test=sd
就没问题了,但是
<a href=xxx target=yyy title = asdfasf> test=sd<tag>又一个标签</tag>
中的test=sd<tag>又会被识别为属性。
我觉得改成下面的正则就没问题了:
/(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig 分别在第二个括号的字符集合和最后的反向预查的字符集合中添加了一个<。
下面再来分析第二个正则,
/\"\'([^\'\"]+)\'\"/ig 这个正则用于匹配双引号,单引号多层嵌套的情况,同样,不用转义,修改正则如下:
/"'([^'"]*)'"/ig
这样基本任务就完成了。测试代码如下:
<script type="text/javascript">
function rp(str,trg){
var reg1 = /(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig
var reg2 = /"'([^'"]*)'"/ig;
str=str.replace(reg1,'$1="$2"').replace(reg2,'\"$1\"');
trg.value=str;
}
</script>
<textarea ><a href = xxx name=aaa target=_blank title='asdfasf'
onclick=alert('blueidea')> asfd=asfd
</textarea>
<input type="button" value="replace"/> 原帖里LeXRus又提出了新问题:
hint=i am lexrus
这样的属性会有问题,不过我感觉不加引号的话,属性值里就不可能有空格,否则会被识别为多个属性了。不过看到最后ncs的回帖我就哭了:
onclick=if(document.forms.length>0)
这样的属性怎么办?大于号会被识别为标签结束……还是分离行为与文档吧。补充一下,其实修补一下正则也可以解决,只要改成如下正则即可:
/(\s+\w+)\s*=\s*([^"\s]+)(?=[^<>]*>)/ig 就是去掉第二个括号内字符集合里的<>。最后这个问题也解决。
给table加上tbody
有若干table,但是没有tbody。现在需要用正则批量加上。
匹配table结束标签</table>比较简单,在前面加上一个</tbody>就行了。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-36054-19.html
为了祖国的统一大业