如何用 js 验证一个 url

JavaScript 中的如何校验一个URL?

最近遇到几次需要校验URL的,就整理一下几个校验URL的方法

1.使用 URL 构造函数来验证 URL

当传递一个字符串给 URL 构造函数时,如果字符串是一个有效的 URL,将返回一个新的 URL 对象。否则,将返回一个错误。

arduino 复制代码
const url = new URL('../cats', 'http://www.example.com/dogs');
console.log(url.hostname); // "www.example.com"
console.log(url.pathname); // "/cats"

在控制台得到的 URL 对象:

当传递一个无效的 URL 字符串:

ini 复制代码
const exampleUrl = new URL('example');
console.log(exampleUrl);

字符串 'example' 不是一个有效的 URL。因此,会报错 TypeError:

1.1 使用 URL 构造函数创建一个 URL 验证器函数

使用 URL 构造函数和 try...catch 语句,创建一个函数:

php 复制代码
function isValidUrl(string) {
  try {
    new URL(string);
    return true;
  } catch (err) {
    return false;
  }
}

如果参数是一个有效的 URL 时,isValidUrl 函数返回 true。否则,返回 false:

arduino 复制代码
console.log(isValidUrl('https://www.example.com/')); // true
console.log(isValidUrl('mailto://mail@example.com')); // true
console.log(isValidUrl('freecodecamp')); // false

浏览器兼容性:

大部分浏览器都支持的

1.2 使用 URL 构造器只验证 HTTP URL

要检查url是否是一个有效的 HTTP URL,不要其他有效的 URL,如 'mailto://mail@example.com'。

要检查url是否是一个有效的 HTTP URL,可以使用 URL 对象的 protocol 属性:

typescript 复制代码
function isValidHttpUrl(string) {
  try {
    const newUrl = new URL(string);
    return newUrl.protocol === 'http:' || newUrl.protocol === 'https:';
  } catch (err) {
    return false;
  }
}

console.log(isValidUrl('https://www.example.com/')); // true
console.log(isValidUrl('mailto://mail@example.com')); // false
console.log(isValidUrl('freecodecamp')); // false

2.使用 npm 包来验证 URL

NPM 包:is-urlis-url-http

2.1 使用 is-url 包验证 URL

使用 is-url 包来检查一个字符串是否是一个有效的 URL。这个包并不检查传递给它的 URL 的协议。

安装:

csharp 复制代码
npm install is-url --save

使用:

ini 复制代码
import isUrl from 'is-url';

const firstCheck = isUrl('https://kikobeats.com'); // true
const secondCheck = isUrl('mailto://kiko@beats.com'); // true
const thirdCheck = isUrl('example'); // false

2.2 使用 is-url-http 包来验证 HTTP URL

安装:

csharp 复制代码
npm install is-url-http --save

使用:

scss 复制代码
import isUrlHttp from 'is-url-http';


isUrlHttp('https://kikobeats.com') // ==> true
isUrlHttp('https://kikobeats.com') // ==> true
isUrlHttp('mailto://kiko@beats.com') // ==> false
isUrlHttp('callto:192.168.103.77+type=ip') // ==> false

3.使用 Regex 来验证 URL

使用正则表达式来检查一个url是否是有效的 URL

所有有效的 URL 都遵循一个特定的模式。它们有三个主要部分,分别是:

复制代码
协议
域名(或 IP 地址)
端口和路径
有时路径后面是一个查询字符串或片段定位符。

3.1 使用正则验证 URL

javascript 复制代码
function isValidUrl(str) {
  const pattern = new RegExp(
    '^([a-zA-Z]+:\\/\\/)?' + // protocol
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
      '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR IP (v4) address
      '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
      '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
      '(\\#[-a-z\\d_]*)?$', // fragment locator
    'i'
  );
  return pattern.test(str);
}

console.log(isValidUrl('https://www.kikobeats.com/')); // true
console.log(isValidUrl('mailto://kikobeats.com')); // true
console.log(isValidUrl('example')); // false

3.2 使用正则验证 HTTP URL

要使用正则来检查一个url是否是有效的 HTTP URL,需要使用协议检查。

使用 '^(https?:\/\/)?',而不是 ^(a-zA-Z+:\/\/)?:

javascript 复制代码
function isValidHttpUrl(str) {
  const pattern = new RegExp(
    '^(https?:\\/\\/)?' + // protocol
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
      '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
      '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
      '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
      '(\\#[-a-z\\d_]*)?$', // fragment locator
    'i'
  );
  return pattern.test(str);
}

console.log(isValidUrl('https://www.kikobeats.com/')); // true
console.log(isValidUrl('mailto://kikobeats.com')); // false
console.log(isValidUrl('example')); // false

参考

相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__7 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.7 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~8 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华9 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子11 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅11 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni12 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学13 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端