首先,咱们要先了解下什么是 URL,URL 英文全称是 Uniform Resource Locator,直译是统一资源定位器,简称网址,通俗理解就是网络上的门牌号。javascript
图片来自 NodeJS 官网文档截图java
一般咱们的网址都不包含 auth 这部分,本文示例会忽略掉,URL 的组成以下:网络
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)
}
复制代码
完结,撒花。
假如你有更好的写法,欢迎给我留言。