正确匹配URL的正则表达式(转)

转自: https://www.cnblogs.com/speeding/p/5097790.html

网上流传着多种匹配URL的正则表达式版本,但我经过试验,最好用的还是从

stackoverflow

上查到的:

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

IP地址、前后有汉字、带参数的,都是OK的。

另外几个有问题的版本:

摘自微软MSDN:

(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?

带参数的匹配有问题。

百度知道中有人回答的:

http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

有严重的汉字问题。

另外,如果只是想匹配URL中的域名部分,则可以用这个:

((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:ww‌​w.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?‌​(?:[\w]*))?)
<think> 首先,用户的问题是:“我想查找用于URL匹配正则表达式 请问用于URL匹配正则表达式”。用户直接询问用于URL匹配正则表达式。 从系统级指令中,我需要: - 所有行内数学表达式使用 $...$ 格式(但这里可能不涉及数学表达式,因为主题是正则表达式)。 - 独立公式使用 $$...$$ 格式并单独成段(同样,可能不适用)。 - LaTeX语法正确正则表达式不是LaTeX,但需要正确呈现)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户提供了几个引用: - 引用[1]: 正则表达式匹配 URL 教程。讨论构建正则表达式匹配 URL。 - 引用[2]: 正确匹配URL正则表达式。给出了一个具体表达式:(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|] - 引用[3]: 网址匹配正则表达式(python实现)。给出了一个更详细的python正则表达式模式:pattern = re.compile( r&#39;^(?:http|ftp)s?://&#39; ... 包括解释。 - 引用[4]: 前端正则表达式:高效匹配中文文本。似乎不相关,因为它讨论的是匹配中文文本,而不是URL。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一条消息,所以没有“上一次的问题”。系统提示说“参考用户上一次的问题和你的回答”,但既然这是第一个用户输入,我就忽略那个部分,专注于当前问题。 用户的核心需求是:查找用于URL匹配正则表达式。 所以,我需要提供一个URL匹配正则表达式,并基于引用内容。 从引用[2],给出了一个表达式:(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|] 从引用[3],给出了一个更详细的表达式:^(?:http|ftp)s?:// ...(完整代码) 我应该选择哪个?引用[3]更详细并有解释,所以推荐那个。 用户指定“参考站内引用”,所以我应该引用这些引用。 回答结构:需要清晰、结构清晰,帮助用户逐步解决问题。 内容大纲: 1. **介绍**:解释URL匹配正则表达式是什么,为什么需要它。 2. **提供表达式**:给出推荐的URL匹配正则表达式。可以使用引用[3]的表达式,因为它更全面。 - 引用[3]的表达式:pattern = re.compile( r&#39;^(?:http|ftp)s?://&#39; r&#39;(?:\S+(?::\S*)?@)?&#39; r&#39;(?:&#39; r&#39;[A-Z0-9.-]+\.[A-Z]{2,6}&#39; r&#39;|&#39; r&#39;localhost&#39; r&#39;)&#39; r&#39;(?::\d{2,5})?&#39; r&#39;(?:/?|[/?]\S+)$&#39;, re.IGNORECASE ) 在回答中,我需要呈现它整洁。 既然用户询问正则表达式,我可以提供它作为一个代码块。 3. **解释**:简要解释关键部分,基于引用[3]的解释。 4. **引用**:在相关段落添加引用标识,如 [^1], [^2], [^3]。 5. **生成相关问题**:在最后,添加§§相关问题§§部分,生成2-3个相关问题。 相关问题可以包括: - 如何测试URL正则表达式? - 有哪些URL正则表达式的常见错误? - 如何优化URL正则表达式性能? 基于引用内容。 最后,确保使用中文回答。 完整回答结构: - 开头:直接回答用户问题。 - 中间:提供表达式和解释。 - 结尾:生成相关问题。 添加引用: - 提到引用[1]教程。 - 提到引用[2]的简单版本。 - 重点引用[3]的详细版本。 正则表达式不是数学,所以不需要$...$或$$...$$,除非有数学部分。但在这个上下文中,正则表达式可以视为代码,所以用代码块呈现。 系统指令说“所有行内数学表达式必须使用 $...$ 格式”,但正则表达式通常是字符串,所以在行内时可以用反引号或类似,但既然有代码块,就用代码块。 在之前的示例中,有Python代码块。 所以,我将使用代码块来显示正则表达式。 在中文中呈现。 </think> 以下我将逐步为您解答“用于URL匹配正则表达式”的问题。URL(统一资源定位符)的匹配是Web开发中的常见需求,例如用于验证网址有效性、爬取网页或过滤输入。正则表达式(Regex)是一个强大的文本匹配工具,能够精确捕捉URL的各个组成部分,如协议、主机名、端口号、路径和查询参数。我将基于您提供的引用内容,为您推荐一个高效且可靠的URL匹配正则表达式版本,并简要解释其结构。 ### 推荐的正则表达式 从您的引用中,我综合了多个来源(特别是引用[2]和引用[3]),推荐一个经过优化的URL匹配正则表达式。这个版本源自引用[3]的Python实现,因为它更全面、可读性好,并支持常见场景(如HTTP/HTTPS/FTP协议、本地主机localhost等)。以下是正则表达式的完整代码和解释: ```regex ^(?:http|ftp)s?:// (?:\S+(?::\S*)?@)? (?: [A-Z0-9.-]+\.[A-Z]{2,6} # 规范的域名,如 example.com | # 或 localhost # 本地主机 ) (?::\d{2,5})? # 可选的端口号,如 :8080 (?:/?|[/?]\S+)?$ # 可选的路径和查询参数,如 /path 或 /path?query=1 ``` #### 关键部分解释: - **协议部分**:`^(?:http|ftp)s?://` 匹配HTTP、HTTPS、FTP或FTPS协议的开头(`s?`表示可选的“s”)。 - **认证信息**:`(?:\S+(?::\S*)?@)?` 处理可选的用户名和密码(如 `user:password@`)。 - **主机名**:`(?: [A-Z0-9.-]+\.[A-Z]{2,6} | localhost )` 匹配标准域名(如 `example.com`)或本地主机 `localhost`。 - **端口号**:`(?::\d{2,5})?` 可选端口部分(如 `:8080`)。 - **路径和查询**:`(?:/?|[/?]\S+)?$` 处理路径和查询字符串(如 `/index.html?param=value`),并确保以有效字符结尾。 这个表达式还添加了 `re.IGNORECASE` 标志(忽略大小写),使其更灵活。在实际使用中(如在Python中),您可以直接编译为模式: ```python import re pattern = re.compile( r&#39;^(?:http|ftp)s?://&#39; r&#39;(?:\S+(?::\S*)?@)?&#39; r&#39;(?:&#39; r&#39;[A-Z0-9.-]+\.[A-Z]{2,6}&#39; r&#39;|&#39; r&#39;localhost&#39; r&#39;)&#39; r&#39;(?::\d{2,5})?&#39; r&#39;(?:/?|[/?]\S+)?$&#39;, re.IGNORECASE ) # 示例测试 url = "https://example.com:8080/path?query=1" if pattern.match(url): print("URL 有效") else: print("URL 无效") ``` 这个正则表达式覆盖了大多数常见URL格式,包括查询参数的网址。如果您需要一个更简化的版本,可以参考引用[2]的表达式:`(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]`,但它可能忽略一些细节(如端口号或本地主机)。建议优先使用上述推荐版本,因为它更严谨[^3]。如果您在使用中遇到问题,可以参考引用[1]的教程,它详细讲解了URL组成部分的匹配原理[^1]。 ### 注意事项 - **测试和调整**:在实际应用中,URL格式可能因上下文而异(例如,是否包含IPv6地址或特定子域)。建议使用在线工具(如Regex101)测试您的正则表达式。 - **性能**:这个表达式在大多数场景下高效,但如果处理超大文本流,优化匹配算法可能更好(如避免贪婪量词)。 - **安全提示**:正则表达式不能完全替代URL解析库(如Python的`urllib.parse`),在安全关键场景下结合使用[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值