正则表达式: 关于 的通用正则表达式(转)

 

 1.  普通的 <a> 元素;希望得到其中的 TEXT 以及 URL 信息;

 

注意: 下面写法不正确:

<a .*?href=(?<quot>["']?)(?<url>.+?/k<quot>.*>(?<text>.+?)</a>

 

对于以下这种情形:

<a href=/website/index.htm >…</a>

也就是说没有引号的情形:不能试图通过匹配 “空”, 来对其进行反向引用;因为“空”实际上可以在任何位置达到匹配;例如,对于上述情形,它实际上在 第一个“/”后面就取得了匹配;然后 URL 会返回“/”;

 

所以对这种连接形式,要对HREF的“末尾标签”的位置信息加上约束;(末尾标签分为3种:” ,  ‘ ,  )。也就是说HREF的末尾,要么直接为TAG右标签“>”,要么必定为一个空格,其后再跟 .*>  形式;这样一来,正则表达式匹配的时候,即便碰到“空标签”它也得保证右边跟一个“>”或跟一个“ ”(空格),才形成匹配;

 

所以正确的改进形式应该为:

<a .*?href=(?<quot>["']?)(?<value>.+?)/k<quot>(>| .*?>)(?<text>.+?)</a>

 

注意红色的部分:表明对HREF的结尾处做约束。

 

注意!为了正确匹配,不要用 .* 作为非限制字符的表达方式!要用 [^>] 也就是禁止右标签!

最终应该改进为:

 

<a [^>]*?href=(?<quot>["']?)(?<value>[^>]+?)/k<quot>(>| [^>]*?>)(?<text>.+?)</a>

 

 

   

2.  对于有特定限制的 <a> 元素:例如:取得“数字”连接:

原来是采取如下形式

<a .*?href=(?<quot>[""']?)(?<value>[^"']+?)/k<quot>[^>]*?>/d</a>

 

这种形式不但戎余,而且碰到HREF的首尾空标签后,也会发生第一种情形引发的错误。

现在,首先我们改进成兼容第一种模式的表达式:

<a .*?href=(?<quot>["']?)(?<value>.+?)/k<quot>(>| .*?>)/d+</a>

 

改成这种形式后:

 

例如:有文本:

 

<div class="fenye">

<div class="Picpagein"><div class="Pagediv">

<span>

<a href="http://weblogs.asp.net/woman/nvbj/qcqbj/2008061616632.htm" mce_href="http://weblogs.asp.net/woman/nvbj/qcqbj/2008061616632.htm"><b>1</b></a>

<a href=”/woman/nvbj/qcqbj/2008061616632_2.htm”>2</a>

</span>

<div class="pagein">

<a href="http://weblogs.asp.net/woman/nvbj/qcqbj/2008061616632_2.htm" mce_href="http://weblogs.asp.net/woman/nvbj/qcqbj/2008061616632_2.htm">下一页&gt;&gt;</a>

</div></div></div></div>

 

采用改进后的初始REGEX 则匹配 URL (也就是HERF中的内容)结果会为:

/woman/nvbj/qcqbj/2008061616632.htm"><b>1</b></a>

<a href=”/woman/nvbj/qcqbj/2008061616632_2.htm

也就是说:它会从“2”之前的第一个 ”作为“尾标签,把其中内容全部包括进去;

其实解决方法也很简单:只要禁止HREF的内容部分中出现任何一个TAG开始标记“<”就可以了,所以改进后为:

<a [^>]*?href=(?<quot>["']?)(?<value>[^>]+?)/k<quot>(>| [^>]*?>)/d+</a>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章