關於 <a></a> 的通用正則表達式

正則表達式: 關於 <a></a> 的通用正則表達式

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