能够匹配HTML代码中链接的正则。
原帖正则:
/<a href=".+?">.+?<\/a>/g 
感觉有点严格,首先要<a href="".+?">有,而且href属性可以是一个或者多个除换行外任意字符(非贪婪)。后面是.+?<\/a>,一个或者多个除换行外任意字符(非贪婪),再加上结束标签。
有个问题,如果a的起始标签最后有空格,或者除了href还有其它属性的话,上面的正则就不能匹配这个链接了。
例如:
<a href="asdfs" >……多了个空格。
<a id="xx" href=""asdfs">……前面有属性。
……
重写正则:
/<a\s(\s*\w*?=".+?")*(\s*href=".+?")(\s*\w*?=".+?")*\s*>[\s\S]*?<\/a>/ 
思路如下:首先要有<a和一个空格。/<a\s/
第一个(\s*\w*?=".+?")*
可以匹配一个属性,属性前面可能有或者没有多余的空格,用\s*匹配;属性名肯定是单词字符,用\w*?匹配;=".+?"就是匹配属性值了非换行字符若干个;整个括号外面加个*表示可能有任意多个属性。
(\s*href=".+?")
匹配href,它也是一个属性,所以只要把上面子正则表达式中的\w修改为href=就行了。
(\s*\w*?=".+?")*重复第一个子正则表达式,再次接受任意个属性。
\s*>,属性最后再加上若干个空格和>。
[\s\S]*?,链接的文字,可能有任何字符组成,若干个,非贪婪。
<\/a>最后是结束标签。
补充:属性名和=之间,以及=和属性值之间也可能有空格。所以要再加上几个\s*。
最后的实例代码如下:
<script type="text/javascript">
function findLinks(str){
  var reg = /<a\s(\s*\w*?\s*=\s*".+?")*(\s*href\s*=\s*".+?")(\s*\w*?\s*=\s*".+?")
*\s*>[\s\S]*?<\/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.blueidea.com" title="无敌">经典论坛
</a></p><a? href = "http://www.blueidea.com/"? >蓝色理想</a>';
var arr = findLinks(str);
</script>