テキスト

URL

URL抽出ツールとは?

200行のメールスレッド、Slackチャンネルのエクスポート、ログファイル、カスタマーサポートのトランスクリプト、Markdownメモ — そこに出てくるURLを、出現順に、重複なしで、別の場所にすぐ貼り付けられる形で取り出したい。顧客がクリックしたリンクを監査ログに残しているのかもしれないし、公開前のドキュメントを外部参照のチェックのためにさらっているのかもしれないし、URLをクローラーに食わせたいのかもしれません。いずれにせよ、スクロールしながら40回もコピペする気にはならないですよね。左パネルにテキストを放り込めば、右パネルで見つかったURLをすべてJSON配列にして返します。

抽出は、http://https://に続く非空白文字列にマッチする、シンプルな正規表現がベースです。各マッチに対して、URLの一部であることがほぼないお尻の記号(ピリオド、カンマ、セミコロン、閉じ括弧 — 文末がリンクになっているときについてくるアレ)を取り除き、URLコンストラクタで検証します。コンストラクタが受け付ければ本物、例外を投げればスキップ。重複は出現順を保ったまま除去 — 最初に出てきたものが残ります。このやり方はWHATWG URL Standardでいう「URL parsing」と一致しており、JavaScriptの正規表現でURLを検出するときの定石でもあります。

出力は文字列のJSON配列で、URLが現れた順に並びます。テキスト中にURLが1つもなければ[] — 空配列で、エラーもトーストも出ません。すべてブラウザ内で動作し、何もアップロードされず、何もログに残りません。RFC 3986が「有効なURL」とは何かを定める基礎仕様で、URLコンストラクタはこれを実装しています。

抽出ツールの使い方

3ステップ。それぞれがこのページの1つのボタンに対応しています。

1

テキストを貼るかサンプルを読み込む

左パネルにテキストを置いてください — メール本文、ログファイル、トランスクリプト、記事、なんでもOK。サンプルを押すと、4つのURLが散りばめられた社内向けメモという現実的な例が読み込まれます。サンプル入力:

チームへ — 注文内容を https://api.shop.example.com/v1/orders/ORD-1001 で確認お願いします
ダッシュボード https://admin.shop.example.com/dashboard?tab=orders もチェックしてください。
お客様(Ava Chen)からは http://support.shop.example.com/tickets/T-4521 経由で連絡が来ています — ドキュメントは https://docs.shop.example.com/api/orders を参照。

このツールが拾うのは<code>http://</code>と<code>https://</code>のURLだけです。<code>shop.example.com</code>のようなスキームなしの裸のドメインはスキップされます(曖昧で、ホスト名なのかファイル名なのかただのテキストなのか判別不能なため)。

2

URL配列を読む

右パネルには、出現順・重複除去済みのURL JSON配列が表示されます。文末記号は取り除かれ、各URLはURLコンストラクタで検証されます — 形が壊れているものは黙ってスキップされ、配列にはパース可能な本物のURLだけが残ります。

3

コピーまたはダウンロード

コピーでJSONをクリップボードに送るか、ダウンロード.jsonファイルとして保存。圧縮を押すと配列が1行にまとまるので、ログ1行にそのまま入れたいときに便利です。入力をリセットしたいときは入力側のクリアを使ってください。

実際にこういうときに使う

カスタマーサポートのチケット監査

お客様が長いメールスレッドをチケットに貼り付けてくる。担当のMarco Riveraは、お客様が参照しているURLをすべて把握する必要があります。メール本文をここに放り込み、配列を取り出して、ひとつずつ開けばOK。スクロールで目を疲れさせる必要も、見落としのリスクもなくなります。

SlackやDiscordのエクスポートをクロール

チャンネルをエクスポートして、リンクされているリソース全部をリンクチェッカーやアーカイブBotに食わせたい。エクスポートはJSONかHTMLで、URLはテキスト・絵文字・メタデータと混ざっています。まるごとここに貼り付ければ、ループ内のfetch()に渡せるきれいなURLリストになります。

公開前のブログ記事やドキュメントのリンク監査

Priya Patelは4,000語の記事を公開する直前で、外向きのリンクが全部生きているか確認したい。Markdownのソースを貼り付けてURL配列を受け取り、チェッカーに通します。Googleのリンクのクロール可能性に関するガイダンスはリンクが機能していることを前提としていて、壊れたリンクはランキングを下げます。

構造化ログからURLを取り出す

アプリのログには、エラーメッセージやリクエストトレース、リファラフィールドにURLが埋め込まれていることがよくあります。インシデント調査で5分間に流れたURLをすべて見たいなら、ログの一部を貼り付けて重複除去すればOK。重複を取り除いたそのリストが、カスケードを引き起こした「あの怪しいURL」を見つける一番速い手段になることも珍しくありません。

よくある質問

ftp:// や mailto: などのスキームも拾いますか?

いいえ — http://https://のみです。一般的に「URL抽出」と言われたときに人が想定しているのはWebリンクで、誤検出を避けるために正規表現は意図的に絞り気味にしています。他のスキームが必要な場合、WHATWG URL Standard自体は対応していますがマッチングは曖昧になりがちです(mailto:はテキストと見分けにくく、ftp:は今や稀)。実際のユースケースがあればフィーチャーリクエストを送ってください。

[テキスト](https://example.com) のようなMarkdownリンクの扱いは?

きれいに処理します。正規表現が括弧内のhttps://example.comを見つけ、文末記号トリムが閉じ括弧を取り除きます。Markdown、BBCode、HTMLの<a href>、その他のたいていの構文から、フォーマット個別のパースをしなくても裸のURLが取り出せます。

重複は順序を保って残すのですか、それとも除去ですか?

除去します(最初の出現順は保持)。テキストにhttps://shop.example.comが3回出てきても、出力では最初の出現位置に1回だけ現れます。除去はシンプルなSetフィルタです — MDNのSetを参照。

パイプ・括弧・カッコのような変な文字を含むURLは?

パイプ(|)や括弧はURLとして妥当ですが実際のURLでは稀なので、空白に続いていない限り正規表現が拾います。マッチの末尾にある閉じ括弧やカッコは、URLの一部というより文の句読点である可能性のほうがずっと高いのでトリムされます。本当に)で終わる本物のURLがあれば、URLコンストラクタは受け付けてくれますが、テキスト上では閉じカッコの後にスペースを入れてやる必要があります。

サイズ上限はありますか?

はい — 1 MBです。これは数千ページ分のテキストに相当し、メールスレッド、トランスクリプト、ログの一部など現実的に貼り付けるものには十分すぎる量です。数MBあるファイルなら、まずチャンクに分けるか、コマンドラインでgrepripgrepに通してから貼ってください。

オフラインでも動きますか?

はい。すべてブラウザ内で動作します — 正規表現マッチも、URLの検証も、重複除去も。ネットワーク通信が発生するのはページの初回ロードだけ。一度開いてしまえば、回線を切っても動き続けます。URLコンストラクタはURL APIとして、すべてのモダンブラウザに最初から組み込まれています。

その他のURL・テキストツール

抽出はあくまで1つの操作。組み合わせて使うと自然なものを集めました: