Palindrome & Anagram Checker — Free HTML CSS JS Snippet
Palindrome & Anagram Checker · Misc · Plain HTML, CSS & JS · Live preview
What's included
Features
About this UI Snippet
Palindrome & Anagram Checker — Normalized Comparison with a Mirror & Letter-Diff Visualization

A palindrome check and an anagram check are both, at their core, comparisons of normalized letter sequences — but naive string comparisons trip on spacing, punctuation, and capitalization. "A man, a plan, a canal: Panama" is a genuine palindrome once you ignore spaces, commas, and case, but a plain str === str.split('').reverse().join('') check on the raw string fails immediately. This snippet normalizes correctly for both checks and visualizes exactly why the result came out the way it did.
Normalizing before comparing
Both tools share one normalize() function: lowercase the string, then strip everything that is not a letter or digit using /[^a-z0-9]/g. This single normalization step is what makes "A man, a plan, a canal: Panama" collapse to amanaplanacanalpanama — a string that genuinely does read the same forwards and backwards — instead of failing on the spaces and punctuation that a human reader mentally ignores anyway.
The palindrome check and its mirror visualization
checkPalindrome() reverses the normalized string with split('').reverse().join('') and compares it against the original. Rather than only reporting true or false, the visual panel renders every character of the normalized string as its own tile, and independently checks whether each character matches its mirror position (clean[i] === clean[n-1-i]) — so even a near-miss palindrome visibly shows exactly which letters break the symmetry and where, rather than leaving you to manually count from both ends to find the mismatch.
Anagram checking via letter frequency, not sorted strings
The classic approach to checking anagrams is sorting both strings' characters and comparing the sorted results — this snippet instead builds a frequency Map for each normalized input via letterCounts(), counting how many times every character appears. Two strings are anagrams exactly when every letter that appears in either string appears the same number of times in both — checked by unioning the key sets of both maps with a Set and comparing counts for every key that appears in either.
Surfacing exactly which letters differ
When two inputs are not anagrams, most checkers just say "no." This one goes further: for every letter where the counts in A and B differ, it records the letter and both counts, then renders each as a chip like s: 2 vs 1 — pinpointing precisely which letter is over- or under-represented in which input, which is far more useful for debugging a near-miss ("did I mistype one letter?") than a flat pass/fail.
Two independent, tab-switched tools sharing one normalization rule
The palindrome and anagram checkers are visually separated into tabs but deliberately reuse the exact same normalize() logic, so a phrase treated as case-insensitive and punctuation-stripped in one tool behaves identically in the other — there is only one definition of "the meaningful characters in this text" across the whole snippet.
Build with AI
Build, Understand, Optimize, and Extend It With AI
Paste this snippet's JavaScript into an AI assistant like Claude and ask it to explain why the anagram checker compares letter-frequency maps rather than sorting both strings, and how that approach makes it easy to report exactly which letters differ. It is also a good base to extend: ask for Unicode-aware normalization that handles accented characters (café vs cafe), a "longest palindromic substring" mode for a larger block of text, or an anagram-solver mode that finds real dictionary words matching a given letter set.
Prompt to recreate it
Copy this into your AI assistant of choice to build the effect from scratch, or as a jumping-off point for your own variant:
Build a client-side palindrome and anagram checker in plain HTML, CSS, and JavaScript, no libraries.
Requirements:
- A tabbed interface switching between a "Palindrome" tool and an "Anagram" tool.
- Both tools must share one normalization function: lowercase the input and strip every character that is not a letter or digit, so spacing, punctuation, and capitalization never affect either result.
- The palindrome tool checks live on every input event whether the normalized text equals its own reverse, and separately renders every normalized character as an individual tile, visually highlighting (e.g. a different background color) each tile whose position matches its mirrored position from the opposite end of the string, even when the overall phrase is not a full palindrome.
- The anagram tool takes two separate text inputs and checks live whether their normalized forms are anagrams of each other by building a letter-frequency count (a map from character to occurrence count) for each input and comparing counts for every letter appearing in either input — do not use a sorted-string-equality approach.
- When the two inputs are not anagrams, display exactly which letters differ and their count in each input (e.g. "s: 2 vs 1"), not just a pass/fail result.
- When they are anagrams, display the shared normalized letters as a sorted list of chips.
- No external libraries — pure JavaScript string, array, and Map operations only.Want to tighten it up first? Run this prompt through the AI Prompt Studio to score it across 8 quality dimensions, catch anti-patterns, and tune the wording for Claude, ChatGPT, or Gemini before you paste it in.
Step by step
How to Use
- 1Switch between Palindrome and Anagram tabsEach tool lives in its own tab with independent inputs and results.
- 2Type a phrase to check for palindromeSpaces, punctuation, and capitalization are ignored automatically — the check runs live as you type.
- 3Read the mirror visualizationEach letter is shown as a tile; green tiles indicate that position matches its mirror position from the other end of the string.
- 4Enter two words or phrases to compareThe anagram tab checks whether both inputs use exactly the same letters the same number of times.
- 5Check the letter chipsA full match shows every normalized letter sorted alphabetically; a mismatch shows exactly which letters differ and by how much.
Real-world uses
Common Use Cases
Got questions?
Frequently Asked Questions
Yes. Both the input text and its reversed form are normalized first — lowercased and stripped of every character that is not a letter or digit — so a phrase like "A man, a plan, a canal: Panama" is correctly recognized as a palindrome.
It builds a frequency map counting how many times each character appears in each normalized input, then compares those counts for every letter that appears in either string. Two strings are anagrams only if every shared and unshared letter has exactly matching counts on both sides.
Both approaches correctly detect anagrams, but the frequency-map approach also makes it straightforward to report exactly which letters differ and by how much when the check fails, which a sorted-string comparison does not directly expose.
Only ASCII letters and digits after lowercasing; spaces, punctuation, and any other symbol are stripped out entirely before either check runs, matching how palindromes and anagrams are conventionally judged in word games.
It means that character's position in the normalized string matches the character at its mirrored position counting from the other end — for a full palindrome, every tile is green; for a near-miss, only the tiles that break symmetry are left uncolored.
Yes. Normalization keeps digits alongside letters, so a numeric palindrome like "12321" or a mixed string like "A1B22B1A" is checked correctly using the same logic as a pure-text phrase.