正则表达式之匹配超链接介绍

正则表达式知识详解之实战 读取网页中超链接 (java版示例)中,有个匹配超链接的正则为<[Aa]\\s+(.*?\\s+)*?href\\s*=\\s*([\"']).+?\\2\\s*(\\s+.*?\\s*)*?>.+?</[Aa]>,这篇文件主要介绍该正则是如何一步一步写出来的。

上面正则表达式组合过程

1、匹配最简单的<a></a>空的标签,由于a可以大写,所以又下面几种情况

  1. 字符串<a></a>,前后都小写,正则为<a></a>
  2. 字符串<a></A>,前小写,后大写,正则为<a></A>
  3. 字符串<A></A>,前后都大写,正则为<A></A>
  4. 字符串<A></a>,前大写,后小写,正则为<A></a>

即,超链接前面可能是<A><a>,后面可能是</A></a>,把上面4种合起来的正则即为<[Aa]></[Aa]>
当然,如果你确定超链接使用的小写或大写,简单点,把[Aa]换成aA即可。

2、超链接里总归会有点内容的,如中文、英文、空格等等,<a>我是超链接</a>
在前面的基础上继续完善:

  1. 由于超链接的内容可以为任意东西,所以我们方便点,直接用英文句号点.来表示。
  2. 内容长度不固定,但至少你得有一个字符吧,所以需要一次或多次,即,用+来限定长度。
  3. 一个页面超链接会有很多,如<a>超链接1</a><a>超链接2</a>,肯定要作为两个超链接,不能当成一个超链接,把超链接1</a><a>超链接2作为内容吧。所以要用?限定为非贪婪模式。

综上,得出内容的正则为.+?,与步骤1合并,即:<[Aa]>.+?</[Aa]>

3、超链接至少要有个href属性吧,现在给a标签加个href属性。
为了方便,href属性的内容我们不细致匹配,直接用.+?,这里?可以不加的,一般把+*这种次数不固定的限制为非贪婪模式不容易出错,除非需要贪婪模式或确定不会导致贪婪匹配。

字符串内容(为了方便我直接用小写的a标签):
<a href= 'http://blog.csdn.net/gnail_oug'>链接1</a><a href ="javascript:void(0);">链接2</a>

  1. 根据上面我们知道http://blog.csdn.net/gnail_ougjavascript:void(0);都可以用.+?来匹配。
  2. a标签href属性之间至少要有一个空格,所以\s+来表示。
  3. href属性面=两边可以没空格也可以有空格,所以用\s*,至此完整正则表达式为(假设只用单引号)<[Aa]\s+href\s*=\s*'.+?'>.+?</[Aa]>
  4. 由于html中引号可用单引号也可用双引号,所以正则要换成<[Aa]\s+href\s*=\s*['"].+?['"]>.+?</[Aa]>
  5. 正常情况下,步骤4用["']是没问题的。一般情况下前面用单引号后面也会用单引号,前面双引号后面也是双引号,即成对出现。严谨起见,我们排除href='aa"这种前后引号不一致的情况。
    这就用到了回溯引用\加数字表示引用当前正则里第几个表达式。
    所以正则表达式变为:<[Aa]\s+href\s*=\s*(['"]).+?\1>.+?</[Aa]>

4、其他属性
超链接除了href属性,有时还会有title等其他属性,这些属性有可能在href属性前,有可能在href属性后。
这里我们不知道有没有其他属性,也不需要知道是什么属性,值是多少,所以我直接用.*??表示非贪婪模式。
如果在href属性前,那么其他属性和href中间至少要有个空格,如果在href属性后,那么其他属性前和href值中间至少要有一个空格,其他属性后可有空格,也可没有直接是>
因此,正则完善成:<[Aa]\s+(.*?\s+)*?href\s*=\s*(['"]).+?\2(\s+.*?\s*)*?>.+?</[Aa]>
注意,这里\1变成了\2,因为前面的分组(.*?\s+)*?占用了序号1。

5、转义
至此,相对比较完善的超链接正则已经完成,由于java里面\需要转义,所以使用了两个斜线\\


本文主要说明一个复杂的正则怎么从一个简单的正则演变的,里面涉及的有些知识点可以参考正则分类

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下正则表达式匹配HTML超链接: ```html <a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1 ``` 这个正则表达式匹配`<a>`标签,并且捕获`href`属性的值。可以使用类似以下的代码来提取所有匹配的链接: ```python import re html = '<a href="https://www.example.com">Example</a><a href="https://www.google.com">Google</a>' links = re.findall(r'<a\s+(?:[^>]*?\s+)?href=(["\'])(.*?)\1', html) for link in links: print(link[1]) ``` 这个代码将输出两个链接: ``` https://www.example.com https://www.google.com ``` 同样,可以使用以下正则表达式匹配HTML图片标签: ```html <img\s+(?:[^>]*?\s+)?src=(["'])(.*?)\1 ``` 这个正则表达式匹配`<img>`标签,并且捕获`src`属性的值。可以使用类似以下的代码来提取所有匹配的图片链接: ```python import re html = '<img src="https://www.example.com/image.jpg"><img src="https://www.google.com/logo.png">' images = re.findall(r'<img\s+(?:[^>]*?\s+)?src=(["\'])(.*?)\1', html) for image in images: print(image[1]) ``` 这个代码将输出两个图片链接: ``` https://www.example.com/image.jpg https://www.google.com/logo.png ``` 对于多媒体标签,可以使用以下正则表达式匹配`<video>`和`<audio>`标签: ```html <(?:video|audio)\s+(?:[^>]*?\s+)?src=(["'])(.*?)\1 ``` 这个正则表达式匹配`<video>`和`<audio>`标签,并且捕获`src`属性的值。同样,可以使用类似以上例子的代码来提取所有匹配的多媒体链接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值