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)
}
複製代碼

完結,撒花。

假如你有更好的寫法,歡迎給我留言。

相關文章
相關標籤/搜索