您现在的位置是:知识 >>正文
正则表达式提取网址
知识95人已围观
简介正则表达式提取网址这事儿,看着简单,实际坑不少。我见过太多人写`https?://\S+`就以为完事了,结果匹配出来的东西带着尾巴——逗号、句号、右括号全混进来了。真到用的时候,比如从用户留言里抓链接 ...
正则表达式提取网址这事儿,正则址看着简单,表达实际坑不少。式提我见过太多人写`https?取网://\S+`就以为完事了,结果匹配出来的正则址东西带着尾巴——逗号、句号、表达右括号全混进来了。式提真到用的取网时候,比如从用户留言里抓链接,正则址或者从日志里筛域名,表达这种粗糙写法准翻车。式提
先看个实际例子。取网一段文本:“欢迎访问 https://example.com/path?正则址q=1&lang=zh,有问题发邮件到 support@example.com。表达” 你要是式提用`https?://\S+`,匹配出来的是`https://example.com/path?q=1&lang=zh,`——中文逗号都收进去了。这问题出在`\S`匹配所有非空白字符,它不认标点。解决思路是明确排除掉结尾常见标点:`https?://[^\s,,。!?;;""''()]+`。这样把逗号、句号、括号全挡在外面。
但别高兴太早。网址里本身可能含括号,比如维基百科的链接`https://en.wikipedia.org/wiki/Regex_(programming)`。你要是把括号排除,好好的链接被拦腰截断。这时候得看上下文——如果网址后面紧跟空格或行尾,那括号就是网址的一部分;如果括号后面还有汉字,八成是正文。正则没法读语义,只能靠规则。我的习惯是:先匹配可能含括号的完整串,再用二次处理去掉结尾多余标点。比如先抓`https?://\S+`,然后对结果做`replace(/[),.;:!?]+$/g, '')`,前提是这些标点不在URL编码里。
还有个容易被忽略的坑:协议大小写。有人写`HTTP://EXAMPLE.COM`,你只写`https?://`就漏了。用`[a-zA-Z][a-zA-Z0-9+.-]*://`更稳,能匹配`ftp://`、`mailto://`(虽然mailto不算严格URL)。但注意,这会把`javascript://`也匹配进来——安全场景下你得加白名单。
真正麻烦的是从HTML源码里提取。标签里的`href`属性值可能带引号、转义字符、相对路径。比如``,你拿绝对URL的正则去匹配,啥也得不到。得先提取`href`的值,再拼接域名。这时候正则的职责是“抓出属性内容”,而不是“判断是不是完整URL”。我常用`href="([^"]*)"`,然后对捕获组单独处理。别嫌麻烦,一步到位反而容易错。
说个我踩过的具体坑。某次从论坛帖子正文里抽外链,正文里有人写`www.example.com`没带协议。我最初只匹配`https?://`,结果漏掉一半。后来加了个分支:`(?:https?://|www\.)\S+`,但这样又误伤纯文本里的`www.`开头句子。最后妥协——先判断该字符串前后是否有空白或标点,再用`(?:(?:https?://|ftp://)|www\.)[^\s<>"']+`。虽然不完美,但至少把误报压到能接受的范围。
正则提取网址的终极建议:别追求一条正则通吃所有场景。文本抽取、HTML解析、日志清洗,各有各的侧重。写之前先问自己三个问题:输入里有没有HTML实体?网址后面跟什么字符?允不允许协议省略?回答完了再动手。真要处理海量复杂文本,别硬刚正则——用`new URL()`解析,或者用BeautifulSoup这类工具,比正则靠谱得多。正则适合“快速过滤”,不适合“严格验证”。
最后送你个小技巧:调试正则时,把测试文本里故意塞满边界情况——中文标点、嵌套括号、大小写混合、无协议域名。跑一遍,看哪里漏了,哪里多了。这比背语法有用十倍。
Tags:
上一篇:把钱借给放高利贷的人
下一篇:济南找工作哪个网站好
相关文章
谷歌收录提交入口
知识谷歌收录提交入口,说白了就两个地方:Google Search Console 的 URL 检查工具,和 sitemap 提交功能。前者适合单页急催,后者管整站批量。别指望提交了就能立刻进索引——谷歌 ...
【知识】
阅读更多对MS12020漏洞如何对靶机进行加固
知识MS12020这个漏洞,本质上是SMB远程代码执行。攻击者发一个精心构造的SMB数据包,就能在目标机器上弹个shell。当年不少内网就是靠它被打穿的。靶机要加固,别急着上补丁,先想清楚一件事——你这台 ...
【知识】
阅读更多fiddler 读取文件
知识Fiddler 抓包时最烦人的一件事,就是每次都得手动在 UI 里点开响应体,再复制到本地。尤其是调试接口返回的 JSON 或 XML,鼠标点得人想摔键盘。其实 Fiddler 早就给了个隐藏技能—— ...
【知识】
阅读更多