creatorvalet

URL Extractor

Finds every link in whatever you paste — and knows that the full stop at the end of the sentence is not part of the address.

Runs in your browser 0 bytes uploaded
Waiting
Links
Domains
No scheme
Trimmed
№ 5881waiting

Paste text above, or drop a file. Nothing is uploaded, and none of the links are visited — they are found in this tab.

Finding a link is trivial. Knowing where it stops is not

Spotting https:// is a single regular expression, and that is why so many of these tools exist. The interesting question arrives one character later and almost nobody answers it well: how far does the address run?

Prose gives you no marker. The sentence ends, and its punctuation sits flush against the last character of the link with nothing between them. See https://example.com/page. reads perfectly to a person and lies to a pattern — the path is /page, the stop belongs to the sentence, and a greedy match hands you a dead link that looks completely fine. You discover the problem later, one click at a time. Commas in a list of sources do the same thing, as do semicolons, colons and the angle brackets an email client wraps around a URL.

Brackets are the case that breaks everything else

Trailing punctuation has an obvious fix: strip it. Brackets do not, because a URL is allowed to contain them and plenty of real ones do. The Wikipedia article about a film that shares its name with something else ends in a closing parenthesis, and that parenthesis is part of the address.

So a rule that removes every closing bracket destroys those links, and a rule that keeps every closing bracket drags in the one Markdown put there. Both rules are wrong, and each is wrong on the cases the other handles. What works is counting: a closing bracket stays if there is an unmatched opening bracket inside the address, and goes if there is not.

The case worth trying yourself is a Markdown link wrapped around one of those addresses — [text](https://ex.org/Foo_(bar)) — where there are two closing brackets and exactly one of them belongs to the link. Counting resolves it; nothing simpler does. The number of addresses that needed any of this trimming is shown next to the results, because it is otherwise invisible — a URL carrying a full stop looks entirely correct until somebody follows it.

Half of what people write has no scheme in front of it

www.example.com is unmistakably a web address to a reader and is not one to any parser: hand it to a browser's own URL machinery and it throws. The same goes for a bare example.com dropped into the middle of a sentence, which is how most people write most domains most of the time.

Both are found here. What they are not is silently rewritten. Choose the as-written output and you get back exactly the characters that were in your text; choose the normalized one and https:// is added along with a lowercased host, so the result can be fed to something else. A guess belongs in a calculation, never in a quotation of what somebody typed. How many were missing a scheme is one of the four counts above the list.

Things shaped like a domain that are not one

Once you accept bare domains you have accepted a hard problem, because README.md, Node.js and index.aspx have precisely the shape of a hostname: a word, a dot, a short run of letters. Filenames are filtered against a hand-picked list of endings that are not top-level domains, and that list is deliberately short — .app, .dev, .sh and .zip are all real endings now, so a sweeping rule about "file extensions" would throw away genuine links.

A second case has nothing to do with files: a sentence that lost the space after its full stop. It ended there.The next one began. contains there.The, which passes every structural test for a domain. The capitalization gives it away — real domain endings are written all lowercase or all uppercase, never with a single leading capital — and that one rule removes an entire class of nonsense from the results. Anything rejected appears underneath the list with its reason, so you can overrule the judgement yourself.

Then there is the boundary with email. ada@example.com contains example.com, and reporting that as a website answers a question nobody asked; those are counted separately and pointed at the email extractor, which handles the whole address. The local half is the subtler trap: ada.lovelace has a dot and a letters-only ending and is therefore indistinguishable from a domain until you look at the character immediately after it.

Just the domains, which is often the real question

"Which sites does this document cite?" is not the same request as "list every link", and it is frequently the one people actually have. The domains output collapses the list to unique hostnames, so a page with forty links to six publishers comes back as six lines. It is a separate mode rather than a filter you apply afterwards, because deduplicating hostnames after the fact means doing it by hand.

If your source is a saved web page rather than plain prose, running it through HTML to Markdown first will flatten the anchors into readable text, and messy pasted text usually behaves better after a pass through the text cleaner.

This URL extractor never visits a single address it finds

No requests are made. Nothing is fetched, no redirect is followed, no shortened link is expanded, and there is no check for whether a page still exists. That is a boundary rather than an omission, and this is the page in the family where it matters most: a tool that already holds a list of URLs is half a step away from crawling with them, and half a step further from being a scraper with a friendlier name.

The practical consequence is that your text stays where it is. There is no endpoint to send it to, so a pasted newsletter, an internal document or a chat export goes no further than this tab. The same holds for the two sibling tools: numbers go through the phone number extractor, and addresses through the email one, and neither of them reaches the network either.

Questions

Why does the ending of a URL need any thought?

Because nothing in ordinary writing marks where an address stops. The sentence does, and the sentence punctuation sits flush against it: "See https://example.com/page." is an address followed by a full stop, but the pattern every other tool uses reads the stop as part of the path. Brackets are worse, because a URL is allowed to contain them — the Wikipedia article about the film ends in a closing parenthesis that genuinely belongs. So the brackets are counted rather than stripped, and a closing one is only removed when there is no opening one inside the address to match it.

Will it visit the links or check whether they work?

No. It never requests a single address it finds — no fetching, no following redirects, no checking whether a page still exists, no expanding shortened links. That is a deliberate limit rather than a missing feature: a tool that already holds a list of URLs is half a step from crawling with them, and this one does not take that step. It reads text you already have, and stops.

What about www.example.com with no https:// in front of it?

It is found, and it is marked. Roughly half of the addresses written in real text have no scheme, and none of them can be handed to a browser or a parser as they stand. So the normalized output adds https:// while the as-written output leaves your text exactly as you typed it — a guess belongs in a calculation, never in a quotation of what somebody wrote. The number of addresses that were missing a scheme is shown next to the list.

Does it treat example.com in the middle of a sentence as a link?

By default yes, and that is a judgement rather than a fact. A bare domain has exactly the same shape as README.md, Node.js and index.aspx, so filenames are filtered by a hand-picked list of extensions that are not domain endings — kept short, because .app, .dev, .sh and .zip are all real endings now. A sentence that lost the space after its full stop is caught separately by its capitalization. If your document is mostly filenames, one checkbox drops bare domains altogether.

Why are email addresses not listed as links?

Because ada@example.com contains example.com, and reporting that as a website answers a question nobody asked. The domain half of an address is counted separately and pointed at the email extractor instead, which is the tool that handles the whole address, its plus-aliases and its duplicates. The local half is the subtler trap: ada.lovelace has a dot and a letters-only ending, so it has the exact shape of a domain, and only the character after it gives it away.