AZ Tools

Markdown Link Extractor

Text

Parses common Markdown link forms — `[text](url 'title')`, `![alt](src)`, reference-style `[text][id]` with `[id]: url 'title'`, and autolinks `<https://…>` — and returns each as a row of `{type, text, url, title}`. Useful for inventorying outbound links for SEO audits, building a sitemap from blog posts, checking for dead URLs across a docs folder, or extracting all images from a README before migrating to a new CDN.

TypeTextURLTitle
imagealt texthttps://example.com/cat.pngCute cat
linka regular linkhttps://example.comExample homepage
linkdocshttps://docs.example.com
linkhelphttps://help.example.comHelp center
linkhttps://example.orghttps://example.org

Output (5 items)

type,text,url,title
image,alt text,https://example.com/cat.png,Cute cat
link,a regular link,https://example.com,Example homepage
link,docs,https://docs.example.com,
link,help,https://help.example.com,Help center
link,https://example.org,https://example.org,

Reference links resolve against `[id]: url` definitions in the same document. Bare URLs not wrapped in `<>` are skipped.

How to use

  1. Paste a Markdown document or section.
  2. Toggle whether images (`![…](…)`) are included.
  3. Pick CSV, JSON, or Markdown list output; copy and feed into your downstream tool.

Frequently asked questions

Which link syntaxes are recognized?
Inline `[text](url)` with optional `"title"` or `'title'`; reference `[text][id]` resolved via `[id]: url "title"` definitions; shortcut `[text][]`; image equivalents with `!` prefix; and HTML-style autolinks `<https://…>`. Bare URLs not wrapped in `<>` are intentionally skipped because they're ambiguous in CommonMark.
Why is a link missing from the output?
Most common reasons: the URL spans multiple lines (Markdown disallows that), there's a stray space between `]` and `(`, or it's a reference link whose definition uses a different ID than the reference. The recognized set follows CommonMark's relaxed rules but isn't a full parser.
Does this fetch the URLs?
No — it only extracts what's in the text. To verify links are alive, pipe the output into a link-checker (`lychee`, `markdown-link-check`, your favorite Node tool).
What about Markdown inside code blocks?
The parser doesn't skip fenced code blocks, so `[example](https://x)` inside ``` ``` ``` will still be picked up. If that's a problem for your input, strip code blocks first with `sed` or a Markdown AST tool.

Related tools