针对原文的正则如下:
/<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i
如果是所有的属性都有双引号的话正则也需要修改。
测试如下:
复制代码 代码如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,'
Flash动画
')}
var reg = /<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i;
var str = '<object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 \
codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/\
swflash.cab#version=5,0,0,0 width=255 height=250><param name=movie \
value=https://www.jb51.net/article/url><param name=quality value=high><embed src=https://www.jb51.net/article/url quality=high \
pluginspage=http://www.macromedia.com/shockwave/download/index.cgi?\
P1_Prod_Version=ShockwaveFlash type=application/x-shockwave-flash \
width=255 height=250></embed></object>';
document.write(replaceReg(reg,str)+'<br />');
</script>
给属性添加双引号
来源:请教正则表达式高手
给HTML标签中的属性添加双引号。
<a href=https://www.jb51.net/xxx>改为:<a href="https://www.jb51.net/article/xxx">
LeXRus的第一个正则如下:
/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig第一个括号没看明白,JS应该是不支持。所以我擅自给删掉了,剩下的正则如下:
/(\s+\w+)\=([^>\"\s]+)/ig第一个括号里的\s+\w+匹配的是属性名。
然后是=,不用转义。
第二个括号里的[^>\"\s]+匹配属性值。不匹配>”和空格。这里的引号不用转义。在意思不改变的情况下,稍微改了改,正则如下:
/(\s+\w+)=([^>"\s]+)/ig需要注意的是这个正则不匹配=两边有空格的属性,例如href = xxx。相匹配的话就改成:
/(\s+\w+)\s*=\s*([^>"\s]+)/ig代码:
str=str.replace(/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig,'$1="$2"');
其中'$1=”$2”'就实现了给属性值添加上双引号。不过ncs指出了这个正则替换的几个问题,一是上面的空格问题,二是如果非标签内部有等号,且前面又恰巧有空白字符的话,它将会被误识别为属性,例如:
<a href=https://www.jb51.net/article/xxx target=yyy title = asdfasf> test=sd
里面的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=https://www.jb51.net/article/xxx target=yyy title = asdfasf> test=sd
就没问题了,但是
<a href=https://www.jb51.net/article/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>就行了。
但是,匹配table的起始标签有点难度,因为可能有属性。不过之前匹配过链接了,这个也大同小异。
实例table代码如下:
<table cellpadding="2" cellspacing="3">
<table>
正则:
/<table\s(\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*?\s*?>/g匹配一个<table,在匹配若干个属性,最后只要再找到>就代表标签结束。
之后再replace一下,加上<tbody>就可以了。
去掉标签的所有属性
来源:正则表达式(Dreamweaver8)
<td>***</td>
变成没有任何属性的
<td>***</td>
思路:非捕获匹配属性,捕获匹配标签,使用捕获结果替换掉字符串。正则如下:
/(<td)\s(?:\s*\w*?\s*=\s*"https://www.jb51.net/article/.+?")*?\s*?(>)/首先,td匹配掉了标签,后面可以用$1引用,后面的若干属性被(?:)匹配掉,而最后匹配的>则可以在后面用$2引用。
示意代码:
str = str.replace(reg,'$1$2');
正则替换特定单词
来源:正则表达式,拒绝几个单词的输入该怎样表达?
要求禁止输入某几个单词,如果拒绝red,yellow,white。这个帖子到时不难,但是让我弄清楚了好几个概念。
第一个,小心字符集合里的“或”
/[^red|yellow|white]/这个正则里的所有或都没有意义,等同于:
/[^redyellowwhite]/意思就是不能含有以下列出的所有字母。
正解:
/red|yellow|white/第二个概念:
只要整个正则匹配成功,无论子正则表达式是否匹配成功,括号都会捕捉。例如
/(red)|(yellow)|(white)/会捕捉到三个结果,尽管实际上最多只可能有一个括号匹配成功。但是只要有一个匹配到了,两外两个也会记录空串。
指定文字高亮显示
来源:如何用正则把网页中的指定的字高亮显示
请教正则表达式:如何替换搜索结果中的关键字为高亮显示?
不劳而获一次,这个子虚乌有前辈已经给出了非常好的解决方案:我直接把代码贴出来了:
复制代码 代码如下: