javascript 验证Node.js中的URL

ttisahbt  于 2023-03-11  发布在  Java
关注(0)|答案(6)|浏览(205)

我想验证以下类型的URL:

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

使用一个正则表达式,这是可以实现的吗?如果可以,请分享一个JavaScript的解决方案。
请注意,我只希望底层协议是HTTP或HTTPS。此外,目前的主要问题是,我们如何在JavaScript中使用一个正则表达式Map所有这三种模式?它不必检查页面是否处于活动状态。如果用户输入的值与上面列出的三种情况中的任何一种相匹配,它应该返回true,另一方面,如果没有,它应该返回false

aydmsdu9

aydmsdu91#

无需使用第三方库

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

gtlvzcf82#

有一个名为**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

如果你想要一个简单的正则表达式-check this out

68bkxrlz

68bkxrlz3#

使用url模块似乎可以达到这个目的。
Node.js v15.8.0文档- 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`);
}
w46czmvw

w46czmvw4#

“valid-url”npm包对我不起作用。它返回了valid,for一个无效的url。对我起作用的是“url-exists”

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

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

q43xntqr5#

另一个简单的方法是使用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是否有效以及它是否存在

pgvzfuti

pgvzfuti6#

我现在也遇到了同样的问题,Pouya的答案可以很好地解决这个问题,我不使用它的唯一原因是我已经在使用NPM包validate.js,它可以处理URL。
正如您在文档中看到的,URL验证器基于gist使用正则表达式,因此您可以使用它而无需使用整个包。
我不是正则表达式的忠实粉丝,但是如果您正在寻找一个正则表达式,最好使用流行包中使用的RegEx。

相关问题