设计目的要使获取的资源尽可能的被直接利用,以提高后续程序运行的效率。
网页上的链接主要可以分为两类:
1. <a> 链接
2.<img> 图片链接
首先来分析<a>链接,该链接基本可以分为以下四种情况:
1 普通链接<a href="http://www.csdn.net">链接到外部网页</a> <a href="inner.htm">链接到内部网页</a> <a href="innerPic.bmp">链接到图片</a> <a href="#">空链接</a>
获取该类型的连接时用如下的表达式:
(?<=(?i)<a/s+[^>]*/s*(href)=)[^>]+?(?="|')(?#>[^>]+</a>) //获得<a空格(...)(空格)href="(...)"格式的连接 //(?<=(...)):是一个先前查看的格式,用来找到符合条件的格式,可以加入自己特定的搜索要求 //(?i)表示在查找的格式中忽略大小写 //<a表示格式头部,也可以写成这种格式:<(a|...)里面可以加入别的HTML标签,比如link,img,meta等 ///s+表示有至少一个空格 //[^>]*匹配此处有零个或者多个非>字符 ///s*有零个或者多个空格 //(href)=匹配标签href,要是还要匹配其他标签可以在括号内加入,比如name,src等 //[^>]+?("|')匹配真正的链接地址,以"或'结束,使用+表示需要匹配字符串,使用?用来表示在第一个"或'处结束。 //(?#...)表示注释 //[^>]+</a>用来输出链接之外的其他信息,在此处可以忽略
问题: <a target=_top href="javascript:window.external.addFavorite('http://www.csdn.net','网页教学网');">加入收藏</a> <a href='#' onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.csdn.net');">设为首页</a> 对于以上链接无法获取 改表达式无法正确捕获如下链接: <a href=/"http://blog.163.com/activities/neteasebb/neteasebb.do?userName=yuki_lyy@126&index=0/"/> 捕获结果是:/" 但是当"="后面跟着"/"的时候该链接失败,说明该种链接形式是无效的,于是不予理睬 ---->只能获取普通链接
一个完整的写法: (?<=(?i)<(a|img)/s+[^>]*/s*(href|src)=")[^>]+?(?="|')(?#>[^>]+</a>) //建议在使用该表达式进行捕获的时候,最好将图片链接和超链接分开,因为通过优化后的表达式对得到的结果已经不 能够区分两者 2 锚记链接定义锚: <a name="C4">Charater4</a> 链接锚: <a href="#C4">Charater</a>
锚(内部)链接,就是name属性的连接 如下: <a href="#C">pual</a> //链接到锚 <a name="C">pual</a> //定义锚
分析:如果使用普通链接获取的表达式所得到锚链接,必然是如下格式: #(url|name) 这个之需要在程序分析的时候做出判断即可。 3 电子邮件链接 <a href="mailto:pual.k3@gamil.com">给我写信</a>
<=<a/s+[^>]*/s*(href)=")[^>]+?@[^>]+?(?='|")(?#[^>]+?</a>) //使用@关键标记匹配邮件地址 //但是如下非法格式无法识别: //<a href="http://blog.163.com/activities/neteasebb/neteasebb.do?userName=yuki_lyy@126&index=0/">
//于是进行如下改进:
(?i)(?<=<a/s+[^>]*/s*(href)=")[^>]+?@[^>]+?(/.[a-zA-Z]{0,}){1,3}(?='|")
//该正则表达式能够匹配超链接中任何邮件格式,但是无法获得邮件链接中附加的比如抄送、主题之类的信息,于是在后面加上附加信息的获取代码:[^>]+?() 则完整格式为: (?i)(?<=a/s+[^>]*/s*(href)=")[^>]+?@[^>]+?(/./w*){1,3}[^>]+?(?='|")
4
对于js脚本的超链接,有如下的格式: <a target=_top href="javascript:window.external.addFavorite('http://www.csdn.net','网页教学网');">加入收藏</a> <a href='#' onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.');">设为首页</a>
这两行代码链接的获取最简单的办法是用该公式获取,为了获得完整的信息,进行贪婪性扩展: (?<=(?i)<(a|img)/s+[^>]*/s*(href|src)=("|'))[^>]+(?="|') 获取结果如下: javascript:window.external.addFavorite('http://www.csdn.net','网页教学网'); #' onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.csdn.net'); 然后,通过程序实现分析.
|