JavaScript中常用的正则表达式日常整理(全)
测试代码如下: lt;script type="text/javascript"gt; function anchorText(str){ var reg =/lt;as(#63;:s*w*#63;s*=s*".+#63;")*(#63;:s*hrefs*=s*".+#63;")(#63;:s*w*#63;s*=s*".+#63;")*s*gt; ([sS]*#63;)lt;/agt;/; str = str.replace(reg,'$1'); return str; } var str = 'lt;a id = "test" href="http://bbs.blueidea.com" title="无敌"gt;经典论坛lt;/agt;'; document.write(anchorText(str)); lt;/scriptgt; 正则判断标签是否闭合 来源:求助 超难!正则表达式如何判断一个标签是否闭合 例如:lt;img xxx=”xxx” 就是没有闭合的标签; lt;pgt;p的内容,同样也是没闭合的标签。 从简单的正则开始,先匹配起始标签 /lt;[a-z]+/i 再加上若干属性: /lt;[a-z]+(s*w*#63;s*=s*".+#63;")*/i 下面就到关键点了,标签的闭合。标签可能有两种方式闭合,lt;img xxx=”xxx” /gt; 或者是lt;pgt;xxx lt;/pgt;。 (s*/gt;) 匹配img类的结束,即/gt;。 (s*#63;gt;[sS]*#63;lt;/1gt;) 匹配p类标签的结束标签。gt;是其实标签末尾,之后是标签内容若干个任意字符,最后的lt;/1gt;就是结束标签了。 加上一个或就可以解决了,最后的完整正则表达式: 整个正则: /lt;([a-z]+)(s*w*#63;s*=s*".+#63;")*(s*#63;gt;[sS]*#63;lt;/1gt;|s*/gt;)/i 拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如 lt;divgt;aaaaaalt;divgt;testlt;/divgt; 也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下: /lt;([a-z]+)(s*w*#63;s*=s*".+#63;")*(s*#63;gt;[sS]*#63;(lt;/1gt;)+|s*/gt;)/i 用正则获得指定标签的内容 有如下代码: lt;channelgt; lt;titlegt;蓝色理想lt;/titlegt; lt;/channelgt; lt;itemgt; lt;titlegt;界面设计测试规范lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;《古典写实美女》漫画教程lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;安远――消失的光年lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;asp.net 2.0多语言网站解决方案lt;/titlegt; lt;/itemgt; nbsp;要求匹配item里的title而不匹配channel里的title。 基本正则: /lt;titlegt;[sS]*#63;lt;/titlegt;/gi 首先是title标签,内容为任意字符若干个,然后是title结束标签。这个正则已经能匹配到所有的title标签。 首先,我简单地修改了一下原正则: /lt;titlegt;[^lt;gt;]*#63;lt;/titlegt;/gi, 因为title里面不应该再嵌有其它标签,这个正则同样是匹配所有标题的内容,最后再加上不去匹配channel中的title。整个正则如下: /lt;titlegt;[^lt;gt;]*#63;lt;/titlegt;(#63;!s*lt;/channelgt;)/gi (#63;!s*lt;/channelgt;)表示要匹配字符串的后面不能跟着若干个空格和一个channel的结束标签。 原帖里有很方便的测试工具,这里就不给测试代码了。 正则判断是否为数字与字母的混合 不能小于12位,且必须为字母和数字的混合。 验证字符串包含数字简单,验证字符串包含字母也简单,验证字符串不包含其它字符也简单,可以用这三个正则分别检查一次字符串,逻辑运算出最终结果。 但是怎么能把这些功能写进一个正则表达式里呢?这个问题真有点伤脑筋。 下面是lexrus的正则: /^([a-z]+(#63;=[0-9])|[0-9]+(#63;=[a-z]))[a-z0-9]+$/ig 思路非常的清晰啊: [a-z]+(#63;=[0-9]) 字母开头,后面必须紧跟着数字。 [0-9]+(#63;=[a-z] 数字开头,后面必须紧跟着字母。 [a-z0-9]+ 后面的字符只要是数字或者字母就可以了。经过测试,发现不好使,123dd会被识别为不合法,dd123则为合法,可见“数字开头,紧跟字母”的正则没有起作用。测试代码如下: lt;script type="text/javascript"gt; function istrue(str){ var reg=/^([a-z]+(#63;=[0-9])|[0-9]+(#63;=[a-z]))[a-z0-9]+$/ig; return reg.test(str); } var str#63; = 'AaBc'; var str2 = 'aaa123'; var str3 = '123dd'; var str4 = '1230923403982'; document.write(istrue(str)+'lt;br /gt;'); document.write(istrue(str2)+'lt;br /gt;'); document.write(istrue(str3)+'lt;br /gt;'); document.write(istrue(str4)+'lt;br /gt;'); lt;/scriptgt; 结果为: false,true,false,false 结果中的第三个,将'123dd'判断为非法是错误的。刚开始以为是g的问题,去掉了还是不好使。应该是浏览器bug,我认为lexrus的正则是正确的,可能是浏览器无法处理或”|”的两边都包含正向预查(#63;=)。 修改之后的正则如下: /^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i 意思和上面差不多,但是没有使用正向预查,测试代码如下: lt;script type="text/javascript"gt; function istrue(str){ var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i; return reg.test(str); } var str#63; = 'AaBc'; var str2 = 'aaa123'; var str3 = '123dd'; var str4 = '1230923403982'; document.write(istrue(str)+'lt;br /gt;'); document.write(istrue(str2)+'lt;br /gt;'); document.write(istrue(str3)+'lt;br /gt;'); document.write(istrue(str4)+'lt;br /gt;'); lt;/scriptgt; nbsp;结果为 false,true,true,false 正确。 空格与英文同时存在 来源:正则问题请指教啊! 匹配英文以及空格,要求必须既有英文字母又有空格。 这个思路和上面的差不多,只要把数字改成空格就可以了。正则如下: (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |