HTML form analyser
Paste form markup and get every field listed, with the accessibility problems called out.
Parsed in your browser with DOMParser. Nothing is uploaded, and scripts in what you paste never run.
Paste markup, get the form pulled apart the way a browser pulls it apart: every input, select and textarea, with its type, name, id, required flag and — the part that decides whether the form is usable — what actually labels it.
The checks are the ones that quietly cost you responses rather than the ones a validator shouts about. Two fields sharing a `name`, where the second value overwrites the first on the way in. A field with no `name`, which never leaves the browser at all. A file input on a form that forgot `enctype="multipart/form-data"`, so the filename arrives and the file does not. A placeholder standing in for a label, which vanishes the moment someone starts typing.
Parsing is done with the browser's own DOMParser, not a regular expression, so what you see listed is what a browser would build from the same markup — including the bits it silently drops. Nothing is uploaded: the markup is read in the page you have open, which means you can audit a form you have not shipped yet. If the report is longer than you feel like fixing by hand, formformform gives you forms with the labels, names and types already right.
What counts as a label
Four things: a <label for="…"> matching the field id, a <label> wrapped around the field, an aria-label, or an aria-labelledby pointing at an id that exists in the markup. A placeholder is not one of them, and neither is a title attribute — both disappear or go unread exactly when someone needs them.
Names are what you receive
The name attribute is the key in the submitted body; the id is only there for labels and CSS. No name means the field is never sent. Two fields with one name means the later value wins and the earlier one is gone without an error — the one exception being radio groups, where sharing a name is the whole mechanism.
Types you have already paid for
A field called email or phone sitting on type="text" gives up free browser validation and the right mobile keyboard, so those get flagged from the name, id, label or placeholder. It runs the other way too: a postcode or card number on type="number" loses its leading zeros.
Parsed, never executed
The markup goes through DOMParser into a detached document that is read, never inserted into the page. Scripts in what you paste do not run, and nothing is sent anywhere — the analysis happens on your machine and works with the network off.
Frequently asked questions
Can it check a form on a live URL?
No — it only reads markup you paste in. Fetching someone else’s page from your browser is blocked by CORS anyway. To grab a real form, open devtools, find the <form> element, and use Copy → Copy outerHTML.
Is a missing label really worth fixing?
It is the difference between a screen reader announcing “Email address, edit text” and announcing “edit text”. A bound label also makes the label itself clickable, which widens the tap target on a phone — and unlike a placeholder, it is still there once the field has something in it.
Why flag duplicate names when radio groups share one?
Radio groups are recognised and left alone: several radios with one name is how a browser knows they are alternatives. The flag is for the other cases — an input and a select on the same name, or two text fields — where the browser sends both values and most servers keep only the last.
Does a clean report mean the form works?
No. This reads static markup only, so it cannot see your server-side validation, your JavaScript handlers, your CSS, colour contrast, focus order, or whether the action URL is reachable. It catches the structural mistakes, which is a floor rather than a certificate.
Other free tools
- Form accessibility checker
Audit form HTML for labels, grouping, instructions and common keyboard or error-message problems.
- HTML input pattern generator
Build and test HTML pattern validation with live matching examples and ready-to-copy attributes.
- Form endpoint tester
Preview the GET URL or POST payload a form would send, without making a network request.
Want the form to collect the answers too?
Hand-written HTML still needs somewhere to post to. formformform gives you the form, the hosting, the responses and the notifications — free while we are in early access.
Start free