分享

正则表达式获取网页链接

 百眼通 2014-10-14

设计目的要使获取的资源尽可能的被直接利用,以提高后续程序运行的效率。

网页上的链接主要可以分为两类:

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');
然后,通过程序实现分析.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多