JavaScript中常用的正则表达式日常整理(全)
str=str.replace(/(#63;!lt;w+)(s+w+)=([^gt;"s]+)/ig,'$1="$2"'); 其中'$1=”$2”'就实现了给属性值添加上双引号。不过ncs指出了这个正则替换的几个问题,一是上面的空格问题,二是如果非标签内部有等号,且前面又恰巧有空白字符的话,它将会被误识别为属性,例如: lt;a href=xxx target=yyy title = asdfasfgt; test=sd 里面的test=sd也会被匹配。三是如果属性原来使用了单引号,会被再包上一层双引号…… 来看看LeXRus前辈的新正则替换方法: str=str.replace(/(#63;!lt;w+)(s+w+)s*=s*([^gt;"s]+)(#63;=[^gt;]*gt;)/ig,'$1="$2"') .replace(/"'([^'"]+)'"/ig,'"$1"'); 先来看第一个正则: / (s+w+)s*=s*([^gt;"s]+)(#63;=[^gt;]*gt;)/ig 结尾新添的(#63;=[^gt;]*gt;)意在解决普通文本中有等号被误识别为属性的问题: lt;a href=xxx target=yyy title = asdfasfgt; test=sd 就没问题了,但是 lt;a href=xxx target=yyy title = asdfasfgt; test=sdlt;taggt;又一个标签lt;/taggt; 中的test=sdlt;taggt;又会被识别为属性。 我觉得改成下面的正则就没问题了: /(s+w+)s*=s*([^lt;gt;"s]+)(#63;=[^lt;gt;]*gt;)/ig 分别在第二个括号的字符集合和最后的反向预查的字符集合中添加了一个lt;。 下面再来分析第二个正则, /"'([^'"]+)'"/ig 这个正则用于匹配双引号,单引号多层嵌套的情况,同样,不用转义,修改正则如下: /"'([^'"]*)'"/ig 这样基本任务就完成了。测试代码如下: lt;script type="text/javascript"gt; function rp(str,trg){ var reg1 = /(s+w+)s*=s*([^lt;gt;"s]+)(#63;=[^lt;gt;]*gt;)/ig var reg2 = /"'([^'"]*)'"/ig; str=str.replace(reg1,'$1="$2"').replace(reg2,'"$1"'); trg.value=str; } lt;/scriptgt; lt;textarea id="sou" style="width:100%"gt; lt;a href = xxx name=aaa target=_blank title='asdfasf' onclick=alert('blueidea')gt; asfd=asfd lt;/textareagt; lt;input type="button" onclick="rp(sou.value,sou)" value="replace"/gt; 原帖里LeXRus又提出了新问题: hint=i am lexrus 这样的属性会有问题,不过我感觉不加引号的话,属性值里就不可能有空格,否则会被识别为多个属性了。不过看到最后ncs的回帖我就哭了: onclick=if(document.forms.lengthgt;0) 这样的属性怎么办?大于号会被识别为标签结束……还是分离行为与文档吧。补充一下,其实修补一下正则也可以解决,只要改成如下正则即可: /(s+w+)s*=s*([^"s]+)(#63;=[^lt;gt;]*gt;)/ig 就是去掉第二个括号内字符集合里的lt;gt;。最后这个问题也解决。 给table加上tbody 来源:通过正则表达式快速在后加上 有若干table,但是没有tbody。现在需要用正则批量加上。 匹配table结束标签lt;/tablegt;比较简单,在前面加上一个lt;/tbodygt;就行了。 但是,匹配table的起始标签有点难度,因为可能有属性。不过之前匹配过链接了,这个也大同小异。 实例table代码如下: lt;table width="100%" border="0" cellpadding="2" cellspacing="3"gt; lt;table width="100%"gt; 正则: /lt;tables(s*w*#63;s*=s*".+#63;")*#63;s*#63;gt;/g 匹配一个lt;table,在匹配若干个属性,最后只要再找到gt;就代表标签结束。 之后再replace一下,加上lt;tbodygt;就可以了。 去掉标签的所有属性 lt;td style="width: 23px; height: 26px;" align="left"gt;***lt;/tdgt; 变成没有任何属性的 lt;tdgt;***lt;/tdgt; 思路:非捕获匹配属性,捕获匹配标签,使用捕获结果替换掉字符串。正则如下: /(lt;td)s(#63;:s*w*#63;s*=s*".+#63;")*#63;s*#63;(gt;)/ 首先,td匹配掉了标签,后面可以用$1引用,后面的若干属性被(#63;:)匹配掉,而最后匹配的gt;则可以在后面用$2引用。 示意代码: str = str.replace(reg,'$1$2'); 正则替换特定单词 要求禁止输入某几个单词,如果拒绝red,yellow,white。这个帖子到时不难,但是让我弄清楚了好几个概念。 第一个,小心字符集合里的“或” /[^red|yellow|white]/ 这个正则里的所有或都没有意义,等同于: /[^redyellowwhite]/ 意思就是不能含有以下列出的所有字母。 正解: /red|yellow|white/第二个概念: 只要整个正则匹配成功,无论子正则表达式是否匹配成功,括号都会捕捉。例如 /(red)|(yellow)|(white)/ 会捕捉到三个结果,尽管实际上最多只可能有一个括号匹配成功。但是只要有一个匹配到了,两外两个也会记录空串。 指定文字高亮显示 请教正则表达式:如何替换搜索结果中的关键字为高亮显示? 不劳而获一次,这个子虚乌有前辈已经给出了非常好的解决方案:我直接把代码贴出来了: lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd"gt; lt;html xmlns="http://www.w3.org/1999/xhtml"gt; lt;headgt; lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /gt; lt;META name="Author" content="Sheneyan" /gt; lt;script type="text/javascript"gt; function encode(s){ return s.replace(//g,"").replace(/lt;/g,"lt;").replace(/gt;/g,"gt;").replace(/([.*[]()$^])/g,"$1"); } function decode(s){ return s.replace(/([.*[]()$^])/g,"$1").replace(/gt;/g,"gt;").replace(/lt;/g,"lt;").replace(//g,""); } function highlight(s){ if (s.length==0){ alert('搜索关键词未填写!'); return false; } s=encode(s); var obj=document.getElementsByTagName("body")[0]; var t=obj.innerHTML.replace(/lt;spans+class=.#63;highlight.#63;gt;([^lt;gt;]*)lt;/spangt;/gi,"$1"); obj.innerHTML=t; var cnt=loopSearch(s,obj); t=obj.innerHTML var r=/{searchHL}(({(#63;!/searchHL})|[^{])*){/searchHL}/g t=t.replace(r,"lt;span class='highlight'gt;$1lt;/spangt;"); obj.innerHTML=t; alert("搜索到关键词"+cnt+"处") } function loopSearch(s,obj){ var cnt=0; if (obj.nodeType==3){ cnt=replace(s,obj); return cnt; } for (var i=0,c;c=obj.childNodes[i];i++){ if (!c.className||c.className!="highlight") cnt+=loopSearch(s,c); } return cnt; } function replace(s,dest){ var r=new RegExp(s,"g"); var tm=null; var t=dest.nodeValue; var cnt=0; if (tm=t.match(r)){ cnt=tm.length; t=t.replace(r,"{searchHL}"+decode(s)+"{/searchHL}") dest.nodeValue=t; } return cnt; } lt;/scriptgt; lt;style type="text/css"gt; .highlight{background:green;font-weight:bold;color:white;} lt;/stylegt; lt;/headgt; lt;bodygt; lt;form onsubmit="highlight(this.s.value);return false;"gt; lt;pgt;lt;input name="s" id="s" title="搜索内容:"/gt;lt;input type="submit" value="搜索"/gt;lt;/pgt; lt;/formgt; lt;div id="content"gt; 测试高亮的代码。很长很长的代码…………………… lt;/divgt; lt;/bodygt; lt;/htmlgt; nbsp;删除标签 来源:如何使用正则表达式去除大部分HTML标记? 删除除了lt;imggt;、lt;brgt;、lt;pgt;之外所有的标签。子虚乌有给出代码中关键的一句: o.innerHTML.replace(/(lt;/#63;(#63;!br|p|img)[^gt;/]*)/#63;gt;/gi,''); 刚开始没反应过来,后来才想起来,这个正则不用区分起始和结束标签。 lt;/#63;(#63;!br|p|img) 匹配除了保护标签外标签的起始标签或者是结束标签的一部分。 [^gt;/]* 匹配到gt;或者/就结束。 /#63;gt; 起始标签或者结束标签的结尾。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |