javascript正则表达式各种链接匹配问题总结

匹配源代码中的链接

能够匹配HTML代码中链接的正则。

原帖正则:

/<a href=".+?">.+?</a>/g 感觉有点严格,首先要<a href="".+?">有,而且href属性可以是一个或者多个除换行外任意字符(非贪婪)。后面是.+?</a>,一个或者多个除换行外任意字符(非贪婪),再加上结束标签。

有个问题,如果a的起始标签最后有空格,或者除了href还有其它属性的话,上面的正则就不能匹配这个链接了。

例如:

 代码如下 复制代码

<a href="asdfs" >……多了个空格。

<a id="xx" href=""asdfs">……前面有属性。

……

重写正则:

/<as(s*w*?=".+?")*(s*href=".+?")(s*w*?=".+?")*s*>[sS]*?</a>/ 思路如下:首先要有<a和一个空格。/<as/

第一个(s*w*?=".+?")*

可以匹配一个属性,属性前面可能有或者没有多余的空格,用s*匹配;属性名肯定是单词字符,用w*?匹配;=".+?"就是匹配属性值了非换行字符若干个;整个括号外面加个*表示可能有任意多个属性。

(s*href=".+?")

匹配href,它也是一个属性,所以只要把上面子正则表达式中的w修改为href=就行了。

(s*w*?=".+?")*重复第一个子正则表达式,再次接受任意个属性。

s*>,属性最后再加上若干个空格和>。

[sS]*?,链接的文字,可能有任何字符组成,若干个,非贪婪。

</a>最后是结束标签。

补充:属性名和=之间,以及=和属性值之间也可能有空格。所以要再加上几个s*。

最后的实例代码如下:

 代码如下 复制代码
 <script type="text/javascript">
 function findLinks(str){
  var reg = /<as(s*w*?s*=s*".+?")*(s*hrefs*=s*".+?")(s*w*?s*=s*".+?")
 *s*>[sS]*?</a>/g;
  var arr = str.match(reg);
  for(var i=0;i<arr.length;i++){
  //alert(arr[i]);
  document.write('link:'+arr[i]+'<br />');
  }
 }
 var str = '<p>测试链接:<a id = "test" href="http://bbs." title="无敌">经典论坛
 </a></p><a? href = "/"? >蓝色理想</a>';
 var arr = findLinks(str);
 </script>

会把所有的链接在页面直接显示出来。注意,

本帖遗留问题:如何执行从右到左的匹配。貌似JS或者VBS没有提供这个功能2、JS或者VBS不支持 后行断言。。用什么方法实现这个功能。

匹配链接的文字

代码:<a href="#>这里要保存</a>,只保存链接的文本内容,标签信息删掉。

前面写过一个匹配链接的正则:

 代码如下 复制代码
 /<as(s*w*?=".+?")*(s*href=".+?")(s*w*?=".+?")*s*>[sS]*?</a>/

不过我们需要捕获的是文字内容,所以需要做一定的修改。第一步就是在所有的括号内都加上?:表示不捕获。第二步就是再多加一个括号放在[sS]*?两侧,这样就可以捕获到链接的文字内容了。最后正则如下:

 代码如下 复制代码

 /<as(?:s*w*?s*=s*".+?")*(?:s*hrefs*=s*".+?")(?:s*w*?s*=s*".+?")*s*>([sS]*?)</a>/ 测试代码如下:

 <script type="text/javascript">
 function anchorText(str){
  var reg =/<as(?:s*w*?s*=s*".+?")*(?:s*hrefs*=s*".+?")(?:s*w*?s*=s*".+?")*s*>
 
 ([sS]*?)</a>/;
  str = str.replace(reg,'$1');
  return str;
 }
 var str = '<a id = "test" href="http://www.111cn.net" title="无敌">经典论坛</a>';
 document.write(anchorText(str));
 </script>

正则判断标签是否闭合

例如:<img xxx=”xxx” 就是没有闭合的标签;

<p>p的内容,同样也是没闭合的标签。

从简单的正则开始,先匹配起始标签

 /<[a-z]+/i 再加上若干属性:

 /<[a-z]+(s*w*?s*=s*".+?")*/i 下面就到关键点了,标签的闭合。标签可能有两种方式闭合,<img xxx=”xxx” />

或者是<p>xxx </p>。

(s*/>)

匹配img类的结束,即/>。

(s*?>[sS]*?</1>)

匹配p类标签的结束标签。>

是其实标签末尾,之后是标签内容若干个任意字符,最后的</1>就是结束标签了。

加上一个或就可以解决了,最后的完整正则表达式:

整个正则:

/<([a-z]+)(s*w*?s*=s*".+?")*(s*?>[sS]*?</1>|s*/>)/i

拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如

<div>aaaaaa<div>test</div>

也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下:

 /<([a-z]+)(s*w*?s*=s*".+?")*(s*?>[sS]*?(</1>)+|s*/>)/i

用正则获得指定标签的内容
来源:求一正则

有如下代码:

 代码如下 复制代码

 <channel>
   <title>蓝色理想</title>
 </channel>
 <item>
   <title>界面设计测试规范</title>
 </item>
 <item>
     <title>《古典写实美女》漫画教程</title>
 </item>
 <item>
     <title>安远??消失的光年</title>
 </item>
 <item>
     <title>asp.net 2.0多语言网站解决方案</title>
 </item> 要求匹配item里的title而不匹配channel里的title。

基本正则:

 代码如下 复制代码

 /<title>[sS]*?</title>/gi

首先是title标签,内容为任意字符若干个,然后是title结束标签。这个正则已经能匹配到所有的title标签。

首先,我简单地修改了一下原正则:

 代码如下 复制代码

 /<title>[^<>]*?</title>/gi,

因为title里面不应该再嵌有其它标签,这个正则同样是匹配所有标题的内容,最后再加上不去匹配channel中的title。整个正则如下:

 代码如下 复制代码

 /<title>[^<>]*?</title>(?!s*</channel>)/gi (?!s*</channel>)

表示要匹配字符串的后面不能跟着若干个空格和一个channel的结束标签。

时间: 2024-09-25 21:56:07

javascript正则表达式各种链接匹配问题总结的相关文章

javascript正则表达式之regexp,匹配string,正则指定字符

exec() 检索字符串中的指定值,返回值是被找到的值,如果没有发现匹配,则返回 null: 主要的RegExp模式匹配方法是exec(),其与上一篇介绍的String对象的match方法相似,只不过它是以字符串为参数的RegExp方法,而不是以RegExp对象为参数的字符串方法.呼,这一句有点像绕口令,没办法,书上的原话,抄过来让大家乐一乐,呵.exec()方法在一个字符串中检索匹配,如果没有找到任何匹配返回null,如果它找到了一个匹配,将返回一个数组. 就像方法match()为非全局检索返

JavaScript正则表达式的分组匹配详解_基础知识

分组 下面的正则表达式可以匹配kidkidkid: /kidkidkid/ 而另一种更优雅的写法是: /(kid){3}/ 这里由圆括号包裹的一个小整体称为分组. 候选 一个分组中,可以有多个候选表达式,用|分隔: var reg = /I love (him|her|it)/; reg.test('I love him') // true reg.test('I love her') // true reg.test('I love it') // true reg.test('I love

详解JavaScript正则表达式之分组匹配及反向引用_javascript技巧

语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的内容 ... \9或$9 用于匹配第一个分组中的内容 用法示例 var reg = /(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1 <-> (A+) //RegExp.$2 <-> ((B|C|D)+) //RegExp.

浅谈JavaScript正则表达式分组匹配_javascript技巧

语法 元字符:(pattern) 作用:用于反复匹配的分组 属性$1~$9 如果它(们)存在,用于得到对应分组中匹配到的子串 \1或$1 用于匹配第一个分组中的内容 \2或$2 用于匹配第一个分组中的内容 ... \9或$9 用于匹配第一个分组中的内容 用法示例 var reg = /(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1 <-> (A+) //RegExp.$2 <-> ((B|C|D)+) //RegExp.

JavaScript正则表达式匹配 div style标签_javascript技巧

测试字符串: <style>v\:* { BEHAVIOR: url(#default#VML) } o\:* { BEHAVIOR: url(#default#VML) } w\:* { BEHAVIOR: url(#default#VML) } .shape { BEHAVIOR: url(#default#VML) } </style> abcdefg <style> @font-face { font-family: Wingdings; } @font-fac

JavaScript正则表达式解析URL的技巧_正则表达式

正则表达式是一个描述字符模式的对象. 首先,此片文章并不是直接告诉你,url的正则表达式是什么,以及怎么使用这个正则表达式去解析一个URL地址,相信这种问题在网络上已经能找到很多.本文的宗旨在于教你如何理解URL的正则表达式,以达到理解正则表达式,以及能够在日后的工作中写出相对简单的正则.言归正传,先看看一下的例子: var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:

javascript正则表达式的模式匹配

正则表达式,是一个描述字符模式的对象.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替换功能.javascript的正则表达式是perl5的这种表达式语法的大小子集,所以多有perl编程经验的程序员来说,学习javascript的正则表达式是小菜一碟. 本章首先介绍用以描述"文本模式"的正则表达式语法.随后讲解了使用表达式String和RegExp方法. 1.正则表达式的定义 javascri

javascript正则表达式学习

最近利用一周时间阅读了<精通正则表达式(第3版)>前6章,希望能够精通正则表达式,并且能够撰写<javascript深度理解正则表达式>这样的文章.一周时间太短,我自认为仅仅是达到了"不再畏惧"."更有信心"的程度,因而本文的目标只能是帮助读者"掌握"正则表达式. 我想正则表达式之所以难,主要体现在以下几个方面: 1)正则表达式的符号晦涩难懂 2)不支持排版(至少javascript目前还不支持) 3)不能设置断点,不能跟

JavaScript正则表达式中的global属性的使用

这篇文章主要介绍了详解JavaScript正则表达式中的global属性的使用,是JS学习进阶中的重要知识点,需要的朋友可以参考下 global是正则表达式对象的只读布尔属性.它指定是否一个特定的正则表达式进行全局匹配.否则它使用"g"属性创建. 语法 ? 1RegExpObject.global 下面是参数的详细信息: NA 返回值: 如果"g"修改被设置返回"TRUE",否则返回"FALSE". 例子: ? 1 2 3 4