推荐优先使用原生 url 构造函数校验和解析 url,它自动处理编码、idn 和标准化,比正则更健壮;正则仅适用于轻量初步校验或提取协议与域名,但无法准确分离根域名,精确场景应使用 psl 等专用库。

JavaScript 中校验 URL 合法性并提取协议、域名,不建议仅靠正则“一招通吃”,但对常见格式做轻量校验和基础解析是可行的。关键在于明确需求:是严格遵循 RFC 3986 规范?还是覆盖主流 http/https/ftp 等协议的常用写法?下面按实用场景给出逻辑和写法。
用正则做基础合法性校验(兼顾可读与覆盖)
一个较平衡的正则表达式如下,能识别带协议、可选端口、路径的常见 URL:
/^(https?:\/\/|ftp:\/\/)[^\s/$.?#].[^\s]*$/i-
说明:开头必须是
http://、https://或ftp://(不区分大小写),接着至少一个非空白、非分隔符字符(防http://单独出现),后续允许任意非空白字符 -
注意:它不校验域名格式(如是否含非法字符)、不验证 IP 或端口合法性,也不处理
file://、mailto:等特殊 scheme;适合表单输入的初步拦截,不能替代后端校验 -
示例:
https://example.com✅,http://127.0.0.1:3000/api✅,example.com❌,http://❌
用正则提取协议和域名(不含端口和路径)
若需从合法 URL 中快速提取协议和主域名(即一级 + 二级域名,如 github.com),可用分组匹配:
-
说明:第一组
$1捕获协议(如https),第二组$2捕获域名部分(含端口,如api.github.com:443);(?=\/|$)是正向先行断言,确保匹配到域名结束位置 -
去端口建议:对
$2再用.split(':')[0]即可拿到纯域名(如api.github.com) -
局限:无法准确分离子域名与注册域名(如区分
shop.amazon.co.uk中的co.uk),如需精确提取根域名,应使用专用库(如psl)或URL构造函数
更可靠的方式:优先用原生 URL 构造函数
现代浏览器和 Node.js(≥ v10.0.0)支持 URL 构造函数,它是解析 URL 的首选,天然规避正则边界问题:
-
校验:尝试构造
new URL(str),捕获TypeError即为非法 URL -
提取协议:
url.protocol(带冒号,如"https:") -
提取主机名(含端口):
url.hostname(纯域名,如"example.com");url.host(含端口,如"example.com:8080") - 优势:自动处理编码、标准化路径、兼容国际化域名(IDN)、符合 WHATWG URL 标准,比手写正则更健壮
需要精确提取根域名时的处理思路
比如从 blog.dev.example.co.uk 中提取 example.co.uk,正则很难通用解决。推荐做法:
- 前端可引入轻量库
psl(Public Suffix List):psl.get('blog.dev.example.co.uk')→'example.co.uk' - 后端(如 Node.js)可用
tldjs或pslnpm 包,配合缓存提升性能 - 若完全避免依赖,可维护一个简易公共后缀白名单(如
['com', 'org', 'co.uk', 'gov.cn']),但覆盖度和维护成本高,不推荐用于生产环境
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











