繁体   English   中英

在 Node.js 中验证 URL

[英]Validating a URL in Node.js

我想验证以下类型的 URL:

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

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

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

有一个名为valid-url的包

var validUrl = require('valid-url');

var url = "http://bla.com"
if (validUrl.isUri(url)){
    console.log('Looks like an URI');
} 
else {
    console.log('Not a URI');
}

安装

npm install valid-url --save

如果你想要一个简单的 REGEX -看看这个

无需使用第三方库

检查字符串是否是有效的 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

编辑

如果您需要将协议限制为一系列协议,您可以执行以下操作

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折旧,代码被简化了一点。 为了解决协议只测试返回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;
    }
};

“valid-url” npm 包对我不起作用。 对于无效的网址,它返回有效。 对我有用的是“url-exists”

const urlExists = require("url-exists");

urlExists(myurl, function(err, exists) {
  if (exists) {
    res.send('Good URL');
  } else {
    res.send('Bad URL');
  }
});

使用 url 模块似乎可以解决问题。

Node.js v15.8.0 文档 - url 模块

const url = require('url');    

try {
  const myURL = new URL(imageUrl);
} catch (error) {
  console.log(`${Date().toString()}: ${error.input} is not a valid url`);
  return res.status(400).send(`${error.input} is not a valid url`);
}

我目前遇到了同样的问题,Pouya 的回答可以很好地完成这项工作。 我不会使用它的唯一原因是因为我已经在使用 NPM 包validate.js并且它可以处理 URLs

正如您从文档中看到的,URL 验证器基于此gist的正则表达式,因此您可以在不使用整个包的情况下使用它。

我不是正则表达式的忠实粉丝,但如果您正在寻找正则表达式,最好使用流行包中使用的正则表达式。

另一个简单的方法是使用 Node.JS DNS 模块。

DNS 模块提供了一种执行名称解析的方法,您可以使用它来验证 url 是否有效。

const dns = require('dns');
const url = require('url'); 

const lookupUrl = "https://stackoverflow.com";
const parsedLookupUrl = url.parse(lookupUrl);

dns.lookup(parsedLookupUrl.protocol ? parsedLookupUrl.host 
           : parsedLookupUrl.path, (error,address,family)=>{
   
              console.log(error || !address ? lookupUrl + ' is an invalid url!' 
                           : lookupUrl + ' is a valid url: ' + ' at ' + address);
    
              }
);

这样你就可以检查 url 是否有效以及它是否存在

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM