基于锚文本获取超链接URL的正则匹配异常问题
解决锚文本含“blog”的超链接URL匹配问题
嘿,这个正则坑我太熟悉了!你遇到的是贪婪匹配导致的错误——原来的表达式里.+会尽可能多地抓取字符,当<a>标签里href后面还有class、id这类属性时,它会把" id="asdasd这类不属于URL的内容也吞进匹配结果里。
修正后的正则表达式
(?i)<a[^>]+href="([^"]+)".*?>.*?blog.*?</a>
关键改进点
- 用
[^>]+替代.+匹配<a>标签的属性部分:[^>]表示匹配**除了>之外的任意字符**,这样只会匹配到标签的闭合>`前的内容,不会越界。 - 用
[^"]+匹配href的属性值:[^"]表示匹配除了双引号之外的任意字符,精准抓取到URL结束的双引号位置,避免把后面的属性内容带进来。
场景验证
正常场景
输入代码:
<a href="http://asdas.com/blog">this is our blog</a> <a href="http://asdas.com/blog">BLOG</a> <a href="http://asdas.com/blog"> blogging </a>
匹配结果:
http://asdas.com/blog http://asdas.com/blog http://asdas.com/blog
异常场景(带额外属性)
输入代码:
<a class="asdadasd" href="http://asdas.com/blog" id="asdasd">this is our blog</a>
匹配结果:
http://asdas.com/blog
额外建议:优先用HTML解析库而非正则
正则处理HTML天生有局限性(比如遇到单引号包裹href、无引号href、标签嵌套等情况容易失效),如果是在代码里处理这类需求,更稳妥的方式是用专门的HTML解析工具:
- Python:
BeautifulSoup,可以通过find_all('a', text=re.compile(r'blog', re.I))筛选锚文本含blog的标签,再提取href属性。 - JavaScript:
cheerio,类似jQuery的语法筛选标签并获取属性。
内容的提问来源于stack exchange,提问作者loveforfire33
相关产品推荐
相关产品推荐

