首先,咱們要先了解下什麼是 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)
}
複製代碼
完結,撒花。
假如你有更好的寫法,歡迎給我留言。