About this tool
Normalise a list of titles into URL slugs, find the ones that collide after folding and truncation, and assign WordPress-style numeric suffixes.
This checker normalises a list of titles into URL slugs and reports which ones land on the same path once accents, case and punctuation have been folded away. Normalisation follows the usual pipeline — transliterate the letters NFKD cannot decompose, apply Unicode NFKD and strip the combining marks in U+0300 to U+036F, lowercase, reduce everything outside a-z and 0-9 to a single separator, then truncate — and duplicates get WordPress-style numeric suffixes starting at -2. It also flags slugs that are empty, all-numeric, or reserved by a framework route.
Open URL Slug Collision Checker on AltFTool — it loads instantly in your browser.
Paste your code or data sample into the workspace.
Pick the format, conversion, or analysis you need.
Copy the polished result straight back into your project.
Expand any title to see the exact string after each normalisation step.
Two long headlines with the same opening are caught after the length limit is applied, not before.
The first title keeps the clean slug and later ones take the next free number, matching what a CMS would do.
Because slug generation throws information away. Case is folded, accented letters are reduced to their base letter, and every run of punctuation or whitespace collapses to one hyphen. "Cafe Munster", "Café Münster!" and "CAFE MUNSTER" all reduce to cafe-munster, so the second and third need a suffix.
It keeps the first one clean and appends the lowest free integer starting at 2, giving my-post, my-post-2, my-post-3. It also skips numbers already taken, so if my-post-2 exists from a different title the next duplicate becomes my-post-3. The post_name column is VARCHAR(200), so a very long slug is trimmed to make room for the suffix.
Hyphens. Google has said for years that it treats a hyphen as a word separator and an underscore as a word joiner, so my_blog_post reads as one token while my-blog-post reads as three words. Both characters are unreserved under RFC 3986 section 2.3, so neither needs percent-encoding — the difference is purely how search engines segment the words.
It normalises to an empty string, because the pipeline keeps only a-z and 0-9. An empty slug cannot be a URL, so you need a fallback — a transliteration library for that script, the record id, or a manually written slug. This tool substitutes a positional placeholder and flags the row so the problem is visible rather than silent.