返回博客

JS URL 校验方法及正则表达式优化

本文探讨了使用 JavaScript 校验 URL 的几种方法,包括使用浏览器内置的 URL 对象和自定义正则表达式。文章分析了不同方法的优缺点,并对一个常见的 URL 正则表达式进行了优化,使其能够更准确地校验 URL 的有效性。

Mt.r
|

测试给了下面这些 url,要进行校验,你看看你的校验规则能通过吗?

www.baidu.com./hello
www.baidu.com123
http://www.baidu.com.cn.
www.baidu.com123./hello

流行的正则判断

开始我随便在网上找了个正则表达式进行判断

// 网址
const Url = /(https|http)?:\/\/([^\/\:]+)?(\:[0-9]+)?(\/[^\?]+)?(\?.+)?/;
Url.test('http://www.baidu.com./hello'); // true

emmmmm,这个正则可能?不太好使

使用浏览器自带的 URL 方法判断

const isUrl = (path) => {
  if (!path.startsWith('http')) {
    return false;
  }
  try {
    const url = new URL(path);
    return !!url;
  } catch (error) {
    return false;
  }
};

isUrl('http://www.baidu.com./hello'); // true

我当时就是????

老老实实去正则

function validURL(str) {
  const pattern = new RegExp(
    '^(https?:\\/\\/)' + // 协议
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // 域名
      '((\\d{1,3}\\.){3}\\d{1,3}))' + // IP
      '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // 端口
      '(\\?[;&a-z\\d%_.~+=-]*)?' + // 请求参数
      '(\\#[-a-z\\d_]*)?$',
    'i'
  );
  return !!pattern.test(str);
}
validURL('http://www.baidu.com./hello'); // false

pomo 巨佬提到过这个规则没有校验 IPV6,我有时间就加上

后记

是不是我们的测试太严格了?一个负责的好测试,可以发现你代码中很多遗漏项和不足之处

让我想起来了一个网传,大概意思如下:

  • 低级开发 测试:你看这有个 bug 开发:什么,怎么可能有 BUG?你给我复现一下。

  • 中级开发 测试:你看这有个 bug 开发:嗯这个我知道我改过了,你重新构建一下就行。

  • 高级开发 测试:你看这,这 bug 在哪找? 开发:你想要啥 bug 我给你加上。