javascript - 在 Node.js 中验证 URL

标签 javascript node.js regex

我想验证以下类型的 URL:

  • www.google.com
  • http://www.google.com
  • google.com

使用单个正则表达式,是否可以实现?如果是这样,请在 JavaScript 中分享一个解决方案。

请注意,我只希望底层协议(protocol)是 HTTP 或 HTTPS。此外,手头的主要问题是我们如何在 JavaScript 中使用一个正则表达式映射所有这三种模式?它不必检查页面是否处于事件状态。如果用户输入的值与上面列出的三种情况中的任何一种匹配,则应返回 true,反之,如果不匹配,则应返回 false

最佳答案

无需使用第三方库

检查一个字符串是否是一个有效的 URL

  const URL = require("url").URL;

  const stringIsAValidUrl = (s) => {
    try {
      new URL(s);
      return true;
    } catch (err) {
      return false;
    }
  };

  stringIsAValidUrl("https://www.example.com:777/a/b?c=d&e=f#g"); //true
  stringIsAValidUrl("invalid"): //false

编辑

如果您需要将协议(protocol)限制为一系列协议(protocol),您可以这样做

const { URL, parse } = require('url');

const stringIsAValidUrl = (s, protocols) => {
    try {
        new URL(s);
        const parsed = parse(s);
        return protocols
            ? parsed.protocol
                ? protocols.map(x => `${x.toLowerCase()}:`).includes(parsed.protocol)
                : false
            : true;
    } catch (err) {
        return false;
    }
};

stringIsAValidUrl('abc://www.example.com:777/a/b?c=d&e=f#g', ['http', 'https']); // false
stringIsAValidUrl('abc://www.example.com:777/a/b?c=d&e=f#g'); // true

编辑

由于 parse 贬值,代码被简化了一点。为了解决仅协议(protocol)测试返回 true 的问题,我不得不说这个实用函数是一个模板。您可以轻松地将其应用于您的用例。对 url.host !== ""

的简单测试涵盖了上述问题
const { URL } = require('url');

const stringIsAValidUrl = (s, protocols) => {
    try {
        url = new URL(s);
        return protocols
            ? url.protocol
                ? protocols.map(x => `${x.toLowerCase()}:`).includes(url.protocol)
                : false
            : true;
    } catch (err) {
        return false;
    }
};

关于javascript - 在 Node.js 中验证 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931079/

相关文章:

javascript - 禁用特定方向的滑动angularjs ionic 框架

node.js - 错误 : Can't set headers after they are sent , 仅在刷新页面后发生

java - 如何获取namedGroup和input关联的值?匹配器.group()

java - 正则表达式匹配数字和运算符之间的空格,但数字之间没有空格

c# - 按最长的正则表达式匹配子字符串拆分

javascript - Dart应用和跨域策略

javascript - 根据我的 Node 版本,我可以使用哪个 npm 版本有限制吗?

javascript - 如何在图像的确认框ok事件onclick上运行php脚本?

node.js - 如何防止 "npm install"或 "npm remove"删除我的个人包裹?

javascript - 从 "abstract"基址 "class"调用构造函数