web-dev-qa-db-ja.com

Node.jsでのURLの検証

タイプのURLを検証したい:

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

単一の正規表現を使用して、それは達成可能ですか?その場合は、JavaScriptでソリューションを共有してください。

基になるプロトコルはHTTPまたはHTTPSであると想定していることに注意してください。さらに、主な問題は、JavaScriptで単一の正規表現を使用してこれら3つのパターンすべてをどのようにマッピングできるかということです。ページがアクティブかどうかを確認する必要はありません。ユーザーが入力した値が上記の3つのケースのいずれかに一致する場合はtrueを返し、そうでない場合はfalseを返します。

12
Arslan Sohail

URLがliveかどうかの確認

これは少しハックですが、私がそうする必要がある場合、これは私がそれに取り組む方法です:

最初のステップ

指定された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);

2番目のステップ

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");
});
  • チェックアウト net-ping パッケージ

第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.
  }
})
  • これがWebサービスの場合は少し危険です(アクションをトリガーできるため)。
  • URLが認証/リダイレクトを必要とする場合、より複雑になります
  • @JanJůnaさんは、HEADを使用する方が良いとコメントしました。彼は完全に正しいです。すべてのWebサーバーがHEADメソッドをサポートしているわけではないことに注意してください
  • request パッケージをチェックしてください

そのためのパッケージがあります!

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');
}

インストール

npm install valid-url --save

それでも単純な正規表現が必要な場合

グーグルはあなたの友達です。 これをチェックしてください

27
Jossef Harush

サードパーティのライブラリを使用する必要はありません

文字列が有効な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
2
pouya

「valid-url」npmパッケージが機能しませんでした。無効なURLに対して有効な値を返しました。私にとってうまくいったのは「url-exists」でした

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

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

私は現在同じ問題を抱えており、Pouyaの答えはうまく機能します。私がそれを使用しない唯一の理由は、すでにNPMパッケージ validate.js を使用していて、 RLを処理する を使用できるためです。

ドキュメントからわかるように、URLバリデーターはこれに基づいた正規表現 Gist なので、パッケージ全体を使用しなくても使用できます。

私は正規表現の大ファンではありませんが、正規表現を探している場合は、一般的なパッケージで使用されているRegExを使用することをお勧めします。

0
Anas Tiour