我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

你可能需要准确知道某个字符串是否是域名/网站地址/URL,虽然可以使用.,/等进行模糊匹配,但是可能会造成误判。

其实用正则表达式来精准匹配是很复杂的,通过代码来判断就简单多了。不过本文还是从域名的定义入手,尝试匹配一个字符串是域名还是URL。在要求不是很高的情况下,使用本文的正则表达式写的代码会相对简单一些。

网站

网址其实就是URL(统一资源定位符),由协议、主机名、路径组成。不过我们平常说的网址中的主机名一般是域名,所以在匹配的时候主要考虑域名。

域名

维基百科对域名的描述:

域名由一个或多个部分组成,各部分之间通常用点号连接起来,最右边的标签为顶级域名,例如:org.uk 的顶级域名。域名层级结构从右向左递减,每层之间以一个点号隔开。每个标签可包含 1 到 63 个八位字节。域名末尾有时有一个点号,为根节点保留,书写时通常省略,查询时由软件填写。域名中的英文字母不区分大小写。完整域名所有字符的总长度不得超过 253 个 ASCII 字符。因此,当每层使用单个字符时,限制为 127 层:127 个字符加 126 个点号,总长度为 253。但在实际应用中,某些域名可能有其他限制,也没有只有一个字符的域名后缀。

后面我就不贴非ASCII字符的描述,比如“.中国”这样的域名。

在中国电信网站备案自助管理系统中,我们可以找到该域名的描述:

域名中的符号由英文字母和数字组成,每个符号不超过63个字符,不区分大小写,符号中除连字符(-)外不能使用其他标点符号,最低级域名写在最左边,最高级域名写在最右边,多个符号组成的完整域名总共不超过255个字符。

小路

路径是一串以/分隔的字符。

正则表达式匹配

在确认URL规范完整之后,使用正则表达式来匹配会更加准确。

域名

现在,让我们尝试匹配域名。

每个标签可以由 -az AZ 0-9 个字符组成,但不能以-作为开头。标签总长度为1-63个字符,因此允许多个标签。

不要忘记我们仍然有一个总长度限制,因此请考虑添加一个零宽度断言 ^.{3,255}$ 来匹配开始和结束,以及中间的任何字符,但长度在 3 到 255 之间。使用零宽度断言,我们可以在不捕获匹配字符串的情况下对后续字符串添加限制。

现在,拼出整个正则表达式:

^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$

网址

针对不同的业务需求,可能会有严格匹配或者宽松匹配的方式。

比如你需要进行一些更加精确的检查,需要进行严格的检查,那么就选择严格匹配;此时任何不符合要求的字符都会被认为不是URL。

如果你只是想做一些简单的检查(比如语法高亮),那么简单的匹配就足够了;因为当你使用浏览器访问这些URL时,你仍然可以正常访问它们,并且URL会为你格式化。

配置--自动打包上传-nuget-file.html[2001:4860:4860::8888]:53/.svg域名.中文URL(严格)

匹配URL和匹配域名不一样,URL要复杂得多,严格匹配需要准确体现URL标准,但实际上为了体现标准而写的正则表达式会非常复杂,所以相比于100%准确匹配,我们还是尽量简单一些。

所以如果你没有什么特殊要求的话,建议你直接跳到最后的“轻松”部分阅读!

我们以以下 URL 为例。

首先是可选的协议名称,然后是域名,然后不要忘记可选的端口号,然后是资源路径。

组合整个正则表达式:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:[0-9]{1,5})?[-a-zA-Z0-9()@:%_\\\+\.~#?&//=]*$

顺便说一句,与域名不同,我们在这里删除了长度限制,因为 URL 可能真的很“长”。

现在,让我们解释一下资源路径中可以使用的字符。

; / ? : @ & = + $ ,这些字符应该进行转义。用于转义的字符是 &xxx;,因此转义后,您可能仍会在 URL 中看到 & 和 ;,但看不到其他字符。

- _ . ! ~ * ' ( ) 这些字符可以不转义,但不建议在 URL 中使用。对于这部分,我们考虑匹配它们。

{ } | \ ^ [ ] ` 这些字符可能会被网关当作分隔符,所以不建议出现在URL中,对于这部分我们考虑匹配。

# % " 控制字符。使用 % 组成其他字符,使用 # 引用 URL 的一部分。

因此我们最终得出结论,应该匹配的特殊字符是@:%_\+.~#?&/=。

URL(松散)

如果你比较放松的话,正则表达式就比较容易写。

此正则表达式不需要包含 https 协议前缀:

^\w+[^\s]+(\.[^\s]+){1,}$

如果上下文要求必须匹配https,那么可以这么写:

二维码
扫一扫在手机端查看

本文链接:https://by928.com/5430.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线