1.
普通的
<a>
元素;希望得到其中的
TEXT
以及
URL
信息;
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
注意:
下面写法不正确:
<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">
下一页
>></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>