JavaScript URL 正则怎么写

首先,咱们要先了解下什么是 URL,URL 英文全称是 Uniform Resource Locator,直译是统一资源定位器,简称网址,通俗理解就是网络上的门牌号。javascript

图片来自 NodeJS 官网文档截图java

一般咱们的网址都不包含 auth 这部分,本文示例会忽略掉,URL 的组成以下:网络

  • protocol://hostname[:port][pathname][?query][#hash](ps: 中括号为可选项)
  • protocol 协议,咱们只考虑 http 或 https
  • hostname 主机地址,能够是域名,也能够是 IP 地址

port 端口,http 默认端口是 80,https 默认端口是 443,能够不写url

例:s.taobao.com/search?init…spa

经过上面对 URL 的了解,咱们先简单判断下 URL:3d

function isUrl (url) {
   return /^https?:\/\/.+/.test(url)
}
复制代码

其中,^ 表示 URL 必须以 h 开头,s? 表示 s 既能够存在,也能够不存在。code

而后咱们须要对 hostname 作判断,主机地址能够是域名「qq.com」,也能够是 IP「127.0.0.1」,但咱们不难发现,无论是域名仍是 IP 地址,它们格式都是 xx.xx。全部咱们能够先这样改进下正则:regexp

function isUrl (url) {
   return /^https?:\/\/([a-zA-Z0-9]+\.)+[a-zA-Z0-9]+/.test(url)
}
复制代码

域名能够带符号吗?我去阿里万网验证了下,带链接符 "-" 是能够注册的。orm

我去查了下资料,域名由各国文字的特定字符集、数字、英文字母及链接符 - 组成,而且 - 不能连续出现,「本文只考虑英文域名」。咱们的正则能够再升级下:cdn

function isUrl (url) {
   return /^https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+)/.test(url)
}
复制代码

[:port][pathname][?query][#hash] 这些都是可选项:

function isUrl (url) {
   return /^(https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+))(:\d+)?(\/.*)?(\?.*)?(#.*)?$/.test(url)
}
复制代码

顶级域名由两组或两组以上的ASCII或各国语言字符构成域名由两组或两组以上的ASCII或各国语言字符构成,如今注册的顶级域名有1000多个,具体能够查看:dnpedia.com/tlds/

本示例中顶级域名只包含英文,因此正则能够改为:

function isUrl (url) {
   return /^(https?:\/\/(([a-zA-Z0-9]+-?)+[a-zA-Z0-9]+\.)+[a-zA-Z]+)(:\d+)?(\/.*)?(\?.*)?(#.*)?$/.test(url)
}
复制代码

完结,撒花。

假如你有更好的写法,欢迎给我留言。

相关文章
相关标签/搜索