JavaScript

JavaScriptのURL.canParse():URLを解析できるか判定する方法

この記事でわかること

URL.canParse()で絶対URLと相対URLの解析可否を判定する方法を解説。ブラウザーとNode.jsでの実行手順、基準URLの指定、期待出力、入力検証での注意点を学べます。

URLの入力を真偽値でチェックする

プロフィールのリンク欄や、記事管理画面の参照先URLを検証するとき、「この文字列をURLとして扱えるか」を調べたい場面があります。独自の正規表現で判定しようとすると、相対パスやポート番号など、考慮する条件が増えてしまいます。

URL.canParse()は、入力をURLとして解析できる場合にtrue、できない場合にfalseを返す静的メソッドです。URLオブジェクトを先に作る必要はありません。文字列のURL構文を判定する用途では、失敗するたびに例外を捕捉するコードを減らせます。MDNのAPI解説

ただし、判定対象はURLとしての解析可否です。リンク先が存在するか、アクセスしてよいか、アプリケーションが受け付ける種類かは別の条件です。本記事では、この区別を保ちながら入力チェックへ組み込む方法を扱います。

動作環境と対応バージョン

確認日は2026年9月22日です。ブラウザーについて、MDNでは2023年12月以降、主要ブラウザーを横断して利用可能になった機能として扱われています。古いブラウザーや組み込みWebViewまで一律に対応しているとは限りません。実行時にはtypeof URL.canParse === "function"で利用可能か確認します。MDNの互換性情報

Node.jsでも同じAPIを利用できます。公式資料による追加バージョンはv19.9.0およびv18.17.0です。本記事の実行環境にはNode.js 24系を使用できます。追加バージョンの記載は、その古い系列の利用を推奨する意味ではありません。Node.jsのURL API

以下のコードはブラウザーとNode.jsの両方を対象とし、グローバルのURLを利用します。追加パッケージやimportは不要です。DOM、ファイル操作、外部通信にも依存しません。

引数と戻り値を理解する

呼び出し方はURL.canParse(input)またはURL.canParse(input, base)です。

  • inputは解析したいURLです。絶対URL、または相対URLを渡します。
  • baseは相対URLの解決に使う基準URLです。省略するとundefinedとして扱われます。
  • 戻り値は真偽値です。解析できればtrue、できなければfalseになります。

たとえばhttps://example.com/helpは単独で解析できます。一方、/helpには接続先の情報がないため、基準URLが必要です。ブラウザー内で呼んでも、表示中のページのURLが自動で基準になるわけではありません。MDNの引数説明

文字列以外を渡した場合

APIは引数を文字列化します。そのため、引数を受け取れたことと、アプリケーションにとって適切な入力であることは一致しません。フォームやJSON由来の値を扱う関数では、先にtypeof input === "string"を確認すると意図が明確になります。

また、文字列化に独自の処理を持つオブジェクトは、その処理自体が例外を投げる可能性があります。「どんな値でも絶対に例外を投げないAPI」と解釈しないでください。本記事の実用例は入力を文字列に限定します。

コピーして動かす基本例

次のコード全体を実行すると、絶対URL、相対URL、壊れたURLの違いを確認できます。外側のブロックは、ブラウザーのコンソールで繰り返し実行しやすくするために付けています。

JavaScript
{
  if (typeof URL === "undefined" ||
      typeof URL.canParse !== "function") {
    console.log("この環境はURL.canParse()に対応していません");
  } else {
    const cases = [
      ["絶対URL", "https://example.com/docs", undefined],
      ["基準なしの相対URL", "/docs", undefined],
      ["基準ありの相対URL", "/docs", "https://example.com/"],
      ["ホスト名がないURL", "https://", undefined],
      ["空文字と基準URL", "", "https://example.com/docs/"],
      ["メール用URL", "mailto:team@example.com", undefined]
    ];

    for (const [label, input, base] of cases) {
      console.log(`${label}: ${URL.canParse(input, base)}`);
    }
  }
}

ブラウザーで実行する

対応ブラウザーで空のタブを開き、開発者ツールのConsoleを選びます。上のJavaScript全体を入力して実行してください。HTMLファイルやローカルサーバーを用意する必要はありません。

Node.jsで実行する

Node.js 24系を用意し、上のJavaScriptをurl-check.jsという名前で保存します。ターミナルで保存先のフォルダーを開き、次のコマンドを実行します。

Shell
node --version
node url-check.js

最初のコマンドでバージョンを確認し、次のコマンドでファイルを実行します。未対応の環境では、サンプルは判定処理へ進まず、未対応というメッセージを表示します。

期待出力

対応環境での期待出力は次のとおりです。これは仕様に基づく期待値であり、本記事の作成時に実機実行した結果ではありません。

CODE
絶対URL: true
基準なしの相対URL: false
基準ありの相対URL: true
ホスト名がないURL: false
空文字と基準URL: true
メール用URL: true

空文字でも有効な基準URLがあれば解析できます。入力必須の欄では、空文字を別途拒否する必要があると分かります。また、mailto:もURLなので、Webページ向けのリンク欄で受け付けるかどうかは追加で判断します。

実用例:HTTPSの絶対URLだけを受け付ける

ここでは「参照先にはHTTPSの絶対URLを登録する」という要件を想定します。相対URLを許可しないため、baseを渡しません。解析できることを確認した後、URLのprotocolを調べます。

以下も独立して実行できるコードです。ブラウザーではConsoleへ入力し、Node.jsではhttps-link-check.jsへ保存してnode https-link-check.jsで実行します。

JavaScript
{
  function validateHttpsLink(input) {
    if (typeof URL === "undefined" ||
        typeof URL.canParse !== "function") {
      return "NG: 実行環境が未対応です";
    }

    if (typeof input !== "string") {
      return "NG: 文字列を入力してください";
    }

    const value = input.trim();
    if (value === "") {
      return "NG: URLを入力してください";
    }

    if (!URL.canParse(value)) {
      return "NG: 絶対URLとして解析できません";
    }

    const parsed = new URL(value);
    if (parsed.protocol !== "https:") {
      return "NG: HTTPSのURLを指定してください";
    }

    return `OK: ${parsed.href}`;
  }

  const inputs = [
    "  https://example.com/docs  ",
    "/docs",
    "http://example.com/",
    "mailto:team@example.com",
    "   ",
    null
  ];

  for (const input of inputs) {
    console.log(validateHttpsLink(input));
  }
}

期待出力は次のとおりです。

CODE
OK: https://example.com/docs
NG: 絶対URLとして解析できません
NG: HTTPSのURLを指定してください
NG: HTTPSのURLを指定してください
NG: URLを入力してください
NG: 文字列を入力してください

new URL(value)には、直前に解析可能と判定した同じ文字列を渡しています。通常の組み込みAPIを使うこの条件では、URL構文エラーを処理するためのtry...catchは不要です。一般にはnew URL()へ解析不能な値を渡すとTypeErrorになるため、判定と生成で異なる値を使わないようにします。MDNのURLコンストラクター

validateHttpsLink()の戻り値は表示用の文字列です。保存処理へ組み込むときは、成功・失敗とメッセージを別のプロパティで返す設計にすると、表示文言に依存せず分岐できます。

失敗しやすい条件と制約

基準URLを渡すと判定の意味が変わる

たとえばexample.comは、基準URLなしでは絶対URLとして解析できません。しかし基準URLを渡すと、相対パスとして扱える場合があります。「利用者がドメイン名を正しく入力したか」を確認したいのに、無条件でbaseを補うと、想定と違う入力まで通過します。

相対URLを受け付けるかどうかを先に決め、そのルールに合わせて引数を選んでください。基準URL自体も有効な値に固定しておくと、入力の問題と設定の問題を切り分けやすくなります。

解析成功は接続成功を意味しない

URL.canParse()は同期処理です。Promiseを返さず、awaitも不要で、判定のために接続先へ通信しません。そのため、DNSの解決、HTTPステータス、ページの存在は確認しません。

実用例のOKも、HTTPSの絶対URLという条件を満たしたという意味です。接続先の信頼性を保証する表示ではありません。特定のサービスへのリンクだけを許す要件なら、解析後のホスト名などにも条件を設けます。

入力の表記をそのまま保存するとは限らない

URLをオブジェクトにすると、hrefは解析後の表記を返します。入力文字列と完全に一致するとは限りません。元の入力を監査や再編集に使う場合は、元の文字列と解析後の値を区別して保持する設計が適しています。Node.jsのURL API解説

活用事例と導入の進め方

プロフィール欄では絶対URLだけを受け付け、記事管理画面ではサイト内の相対パスも受け付ける、といった使い分けができます。CSVの取り込み処理でも、行ごとのURL構文チェックに利用できます。

導入時は、絶対URLだけにするか、空欄を許すか、どのプロトコルを受け付けるかを決めます。そのうえで、型と空欄を確認し、URL.canParse()で解析可否を調べ、用途固有の条件を追加します。この順序なら、入力を拒否した理由も説明しやすくなります。

公式参考資料

PREFERRED SOURCES

Googleの優先するニュース提供元にSEの部屋を追加

Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。

Googleの設定画面で確認する 新しいタブで開きます

候補にSEの部屋が表示されない場合は、まだ追加できません。

y.
WRITTEN BY

y_ymo10

SEの部屋で、HTML・CSSからJavaScript・React・Next.jsまで、Web制作の開発ノートを公開しています。

ほかの開発ノートを読む →