MarkdownからリンクのテキストとURLを抽出
Markdownのテキストから、すべてのリンクを表示文と宛先の一覧として取り出せます。サンプルでは setup guide から Home までの4件が得られ、[support][] のような参照形式のリンクも実際の宛先に解決されます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
Markdownを表示したり独自のパーサーを作成したりせずに、ソースを整理されたリンク一覧へ変換できます。インラインリンクと参照形式リンクを検出し、参照定義を解決して、表示テキストとリンク先URLを元の順序で返します。画像およびコード内のリンク例は除外し、リンクがない文書には空の一覧を返します。処理は決定論的でネットワークを使用せず、README、文書ページ、変更履歴、課題テンプレート、生成済みMarkdownに利用できます。
リンクの表示文と宛先をまとめて取得
結果の<code>links</code>配列では、各項目の<code>text</code>に表示ラベル、<code>url</code>に宛先が入ります。<code>[ガイド](https://example.com/setup)</code>のようなインラインリンクは直接返されます。
読者が目にする順序を維持するため、監査、移行、レポートで再整列する必要がありません。同じリンクの複数回の出現も、ナビゲーションを調べる際には意味があるため保持します。対応するリンクがない場合は、通常の文書をエラーにせず、空の配列を返して正常終了します。
空のMarkdownも同じ扱いです。
コード例をリンクと誤認せずに参照を解決します
Markdownの参照では、明示形式、短縮形式、省略形式のラベルを使用できます。対応する定義があれば、<code>[ラベル][id]</code>、<code>[ラベル][]</code>、<code>[ラベル]</code>を抽出します。ラベルは大文字と小文字を区別せず、連続する空白も正規化して照合します。
山括弧で囲んだ宛先と任意のタイトルも認識しますが、この機能が返すのはテキストとURLだけなのでタイトルは含めません。感嘆符で始まる画像構文は、ナビゲーションリンクではなくリソースの参照であるため除外します。フェンス付きコードブロックとインラインコードも無視し、技術的な例が実際のリンク一覧へ混ざることを防ぎます。
参照定義だけでは結果項目を作成しません。表示ラベルの装飾記号は取り除き、エスケープされた句読点は元に戻します。
構造化したリンクを文書管理へ組み込めます
リンク一覧は、文書の移転、ドメイン変更、終了したサービスへの参照確認に役立ちます。各URLを承認済みの検証工程へ渡したり、ホスト別に分類したり、2つの版を比較して追加と削除を確認したりできます。編集担当者は曖昧なラベルを探し、開発担当者は生成README内の重複参照を把握できます。
処理上限は100万文字です。
活用例
文書のリンク先を監査します
可用性、所有者、移行準備を確認する前に、ナビゲーションURLを順序付きで一覧化できます。
リンクラベルを見直します
曖昧な表示文を見つけ、文書のアクセシビリティと明瞭さを改善できます。
Markdownの版を比較します
2つの版からリンクを抽出し、追加、置換、削除された宛先を特定できます。
よくある質問
どのリンク形式に対応していますか?
定義が存在する場合、インライン形式と完全、短縮、省略の各参照形式に対応します。
Markdown画像も含まれますか?
いいえ。 埋め込みリソースの参照元ではなく、ナビゲーションリンクだけを抽出します。
リンクがない場合はどうなりますか?
正常に完了し、空の<code>links</code>配列を返します。
コード例の中のリンクも数えますか?
いいえ。コードブロックや行内のコードは飛ばすため、チュートリアルのMarkdown例が実際のリンク一覧に混ざることはありません。参照を定義するだけの行も一覧には出ず、実際に使われたリンクだけが並びます。
リンクが今も有効かどうか確認しますか?
いいえ。宛先を開いたり、状態を調べたり、転送をたどったり、テキストを変えたりはしません。貼り付けたテキストを読むだけなので、同じ入力からは常に同じ順の一覧が得られます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev2/markdown-link-extract \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Read the [guide](https://example.com/guide) and [API docs][api].\n\n[api]: https://example.com/api"}'const res = await fetch("https://api.kit.forhosting.com/dev2/markdown-link-extract", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Read the [guide](https://example.com/guide) and [API docs][api].\n\n[api]: https://example.com/api"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev2/markdown-link-extract",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Read the [guide](https://example.com/guide) and [API docs][api].\n\n[api]: https://example.com/api"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev2/markdown-link-extract", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Read the [guide](https://example.com/guide) and [API docs][api].\\n\\n[api]: https://example.com/api"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Read the [guide](https://example.com/guide) and [API docs][api].\n\n[api]: https://example.com/api"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev2/markdown-link-extract", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Read the [guide](https://example.com/guide) and [API docs][api].\n\n[api]: https://example.com/api"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev2.markdown_link_extract",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_chars | 1000000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
1回のリクエストでリンクの表示文と宛先を取得できます
Markdownソース全体を<code>text</code>フィールドへ入力してください。<code>[API][docs]</code>のような参照は、文書内で後から登場する<code>[docs]: https://example.com/api</code>のような定義にも対応します。
構造化したリンクを文書管理へ組み込めます
この機能はURLへアクセスせず、HTTPステータスの確認、リダイレクトの展開、Markdownの変更も行いません。そのため高速かつ非公開で、同じ入力から常に同じ順序の結果が得られます。<code>text</code>がない場合や文字列でない場合は<code>invalid_input</code>を返し、不正なリクエストとリンクのない正常な文書を区別できます。APIは1回$0.002で利用できます。
技術的な質問
URLが利用可能か確認しますか?
いいえ。ネットワークアクセス、リダイレクト追跡、HTTPステータス確認は行いません。
APIリクエストの料金はいくらですか?
1回のAPIリクエストは$0.002です。ブラウザーでは同じ決定論的な抽出をローカルで実行できます。