正则表达式获取网页链接

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

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

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.webjx.com');">设为首页</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');
然后,通过程序实现分析.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值