验证Node.js中的Url

Ars*_*ail 10 javascript node.js

您好,我想使用单个reguar表达式验证www.google.comhttp://www.google.comgoogle.com类型的网址,是否可以实现,如果是这样,请在javascript中共享解决方案.请注意我只希望底层协议是HTTP或HTTPS morover现在的主要问题是我们如何使用Javascript中的单个正则表达式映射所有这三个模式,它不必检查页面是否处于活动状态,如果用户输入的值与上面列出的三个案例中的任何一个匹配,那么另一方面它应该返回true,如果它没有它应该返回fasle.

pou*_*uya 34

无需使用第三方库

检查字符串是否是有效的 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
Run Code Online (Sandbox Code Playgroud)

编辑

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

  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
Run Code Online (Sandbox Code Playgroud)

编辑

由于parse折旧,代码被简化了一点。为了解决仅协议测试返回的true问题,我不得不说这个实用程序函数是一个模板。您可以轻松地将其应用于您的用例。上述问题由一个简单的测试覆盖url.host !== ""

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
Run Code Online (Sandbox Code Playgroud)

  • 不适用于无效协议 `stringIsAValidUrl("abc://www.example.com:777/a/b"); //真` (2认同)
  • @StephaneJanicaud 它仍然有效。`abc` 可以是在操作系统上注册的自定义协议,由特定应用程序处理。问题是关于验证此函数所做的 URI。如果您想限制协议,您可以通过进一步解析 URI 来实现。 (2认同)
  • @StephaneJanicaud 没什么大不了的。请参阅我更新的答案。正如我之前所说,不需要使用第三方库。Node.js `url` 模块可以解析和验证任何 url。 (2认同)

Jos*_*ush 27

检查URL是

这有点像黑客,但如果我需要这样做,这就是我接近它的方式:

第一步

从给定的URL解析并提取域/ ip

http:// drive.google.com/0 /23➡drive.google.com

这是在nodejs中如何做到这一点:

var url = require("url");
var result = url.parse('http://drive.google.com/0/23');
console.log(result.hostname);
Run Code Online (Sandbox Code Playgroud)

第二步

ping提取的域/ ip - 由于网络配置的原因,并非所有服务器都会响应ICMP(PING)请求.

var ping = require ("net-ping");

var session = ping.createSession ();

session.pingHost (target, function (error, target) {
    if (error)
        console.log (target + ": " + error.toString ());
    else
        console.log (target + ": Alive");
});
Run Code Online (Sandbox Code Playgroud)

第3步

您可以对该URL执行HTTP HEAD请求并检查状态代码.

var request = require('request');
request({method: 'HEAD', uri:'http://www.google.com'}, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage.
  }
})
Run Code Online (Sandbox Code Playgroud)
  • 如果这是一个Web服务(因为您可以触发操作),这有点冒险.
  • 如果url需要身份验证/重定向,则会更复杂
  • @JanJůna评论说使用HEAD更好.他完全正确.请注意,并非所有Web服务器都支持HEAD方法
  • 查看请求

有一个包!

您可以使用名为validUrl的现有nodejs包

用法:

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');
}
Run Code Online (Sandbox Code Playgroud)

安装:

npm install valid-url --save
Run Code Online (Sandbox Code Playgroud)

如果你还想要一个简单的REGEX

谷歌是你的朋友.看一下这个

  • 不建议使用第三方库来解决这个非常简单的问题,因为已经有一个本机解决方案。这只会导致 node_modules 臃肿的问题。 (4认同)
  • 在第3步中,您不必发送GET请求.简单的HEAD请求将告诉您完全相同,它不会下载整个内容. (2认同)