Skip to content
Novus Examples
html6.9 KB

Pattern-Constraint Matrix (HTML)

Eight text controls carrying anchored pattern regexes - postcode, SKU, hex colour, slug, IPv4, ISO week, licence key and username - each with a title that supplies the message browsers otherwise phrase generically.

Preview — first 37 lineshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pattern-constraint matrix - Novus Examples</title>
<meta name="description" content="Eight anchored HTML5 patterns, each with its own custom failure message. SAMPLE test data only.">
<style>:root{--bg:#f6f7f9;--card:#fff;--fg:#1a1d23;--muted:#5b6472;--border:#d9dee6;--accent:#0f9d6b;--accent-d:#0c7f56;--err:#d33;--radius:10px}*{box-sizing:border-box}body{margin:0;font:16px/1.5 system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;background:var(--bg);color:var(--fg);padding:2rem 1rem}.wrap{max-width:640px;margin:0 auto}.card{background:var(--card);border:1px solid var(--border);border-radius:16px;padding:1.75rem;box-shadow:0 1px 3px rgba(0,0,0,.05)}h1{margin:0 0 .25rem;font-size:1.55rem}.lead{margin:0 0 1.5rem;color:var(--muted)}form{display:grid;gap:1.1rem}.field{display:grid;gap:.35rem}label{font-weight:600;font-size:.92rem}.req{color:var(--err)}.hint{font-size:.8rem;color:var(--muted)}input,select,textarea{font:inherit;color:inherit;background:#fff;border:1px solid var(--border);border-radius:var(--radius);padding:.6rem .7rem;width:100%}input:focus,select:focus,textarea:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:var(--accent)}textarea{resize:vertical;min-height:110px}input[type=range]{padding:0}input[type=color]{height:44px;padding:.25rem}input[type=file]{padding:.45rem}.group{display:grid;gap:.45rem}.opt{display:flex;align-items:center;gap:.55rem;font-weight:400}.opt input{width:auto}.inline{display:flex;flex-wrap:wrap;gap:1rem}fieldset{border:1px solid var(--border);border-radius:12px;padding:1rem;margin:0}legend{font-weight:600;padding:0 .4rem}.hp{position:absolute!important;left:-9999px;width:1px;height:1px;overflow:hidden}button{font:inherit;font-weight:700;cursor:pointer;border:0;border-radius:var(--radius);padding:.7rem 1.3rem}.btn{background:var(--accent);color:#fff}.btn:hover{background:var(--accent-d)}.btn-ghost{background:transparent;color:var(--muted);border:1px solid var(--border)}.actions{display:flex;gap:.6rem;flex-wrap:wrap;margin-top:.3rem}.ok{display:none;background:#e7f7ef;border:1px solid #b6e6cf;color:#0c7f56;border-radius:var(--radius);padding:.7rem .9rem;font-size:.9rem}.foot{margin-top:1.25rem;font-size:.78rem;color:var(--muted);text-align:center}@media(max-width:480px){body{padding:1rem .5rem}.card{padding:1.25rem}}.grid2{display:grid;gap:1.1rem;grid-template-columns:1fr}@media(min-width:560px){.grid2{grid-template-columns:1fr 1fr}}.note{font-size:.82rem;color:var(--muted);border-left:3px solid var(--border);padding:.15rem 0 .15rem .7rem;margin:.2rem 0}.steps{display:flex;gap:.4rem;flex-wrap:wrap;list-style:none;padding:0;margin:0 0 1.1rem;font-size:.8rem}.steps li{border:1px solid var(--border);border-radius:999px;padding:.2rem .7rem;color:var(--muted)}.steps li[aria-current=step]{border-color:var(--accent);color:var(--accent-d);font-weight:700}.vh{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}table.matrix{width:100%;border-collapse:collapse;font-size:.85rem}table.matrix th,table.matrix td{border:1px solid var(--border);padding:.4rem .5rem;text-align:left}table.matrix th{background:#eef1f5;font-weight:600}[data-branch]{display:none}[data-branch].on{display:grid}input:read-only,textarea:read-only{background:#f1f3f6;color:var(--muted)}input:disabled,select:disabled,textarea:disabled{background:#eceff3;color:#9aa3af}</style>
</head>
<body>
<main class="wrap"><div class="card">
<h1>Pattern-constraint matrix</h1>
<p class="lead">Eight anchored HTML5 patterns, each with its own custom failure message. SAMPLE test data only.</p>
<form method="post" action="#" novalidate>
<div class="hp" aria-hidden="true"><label>Leave this field empty<input type="text" name="website" tabindex="-1" autocomplete="off"></label></div>
<fieldset><legend>Codes and identifiers</legend>
<div class="field"><label for="f-postcode">UK-style postcode <span class="req">*</span></label><input id="f-postcode" type="text" name="postcode" placeholder="SW1A 2AA" pattern="[A-Z]{1,2}[0-9][0-9A-Z]? ?[0-9][A-Z]{2}" title="Two letters, a digit, a space, then a digit and two letters - for example SW1A 2AA." required></div>
<div class="field"><label for="f-sku">Stock keeping unit <span class="req">*</span></label><input id="f-sku" type="text" name="sku" placeholder="NX-0421-AB" pattern="NX-[0-9]{4}-[A-Z]{2}" title="NX, four digits and two capitals - for example NX-0421-AB." required></div>
<div class="field"><label for="f-licence_key">Licence key</label><input id="f-licence_key" type="text" name="licence_key" placeholder="ABCDE-12345-FGHIJ-67890" pattern="([A-Z0-9]{5}-){3}[A-Z0-9]{5}" title="Four groups of five capitals or digits, joined by hyphens."></div>
<div class="field"><label for="f-username">Username</label><input id="f-username" type="text" name="username" autocomplete="username" pattern="[a-z0-9_]{3,20}" title="3 to 20 lowercase letters, digits or underscores." minlength="3" maxlength="20"></div>
</fieldset>
<fieldset><legend>Formats a parser often gets wrong</legend>
<div class="field"><label for="f-hex_colour">Hex colour</label><input id="f-hex_colour" type="text" name="hex_colour" placeholder="#0f9d6b" pattern="#[0-9a-fA-F]{6}" title="A hash followed by exactly six hexadecimal digits."></div>
<div class="field"><label for="f-url_slug">URL slug</label><input id="f-url_slug" type="text" name="url_slug" pattern="[a-z0-9]+(-[a-z0-9]+)*" title="Lowercase words joined by single hyphens, no leading or trailing hyphen."></div>
<div class="field"><label for="f-ipv4">IPv4 address</label><input id="f-ipv4" type="text" name="ipv4" inputmode="numeric" placeholder="192.0.2.24" pattern="((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])" title="Four dot-separated octets, each 0 to 255."></div>
<div class="field"><label for="f-iso_week">ISO week</label><input id="f-iso_week" type="text" name="iso_week" placeholder="2026-W32" pattern="[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])" title="A four-digit year, a capital W, then a two-digit week from 01 to 53."></div>
</fieldset>
<p class="hint" data-locked="notice">SAMPLE test data only - nothing is submitted, uploaded, or stored.</p>
<div class="ok" role="status">Every pattern matched - nothing was sent.</div>
<div class="actions"><button type="submit" class="btn">Check the patterns</button></div>
</form>
<p class="foot">Free example form from Novus Examples · works offline, no data leaves your browser.</p>
</div></main>
<script>document.querySelectorAll('form').forEach(function(f){f.addEventListener('submit',function(e){e.preventDefault();var hp=f.querySelector('.hp input');if(hp&&hp.value){return;}if(!f.checkValidity()){f.reportValidity();return;}var ok=f.querySelector('.ok');if(ok){ok.style.display='block';ok.scrollIntoView({block:'nearest'});}f.reset();});});</script>
</body>
</html>

Specifications

Fields
8
Use Case
software-quality
Validation
HTML5 pattern + title messages
Honeypot
true
Standalone
true
Dependencies
none
Patterns
8
Custom Messages
true

What is a .html file?

HTML (HyperText Markup Language) is the structural markup language of the web, using nested tags to define document content, semantics, and links. It is typically paired with CSS for presentation and JavaScript for behavior. It is the foundational format rendered by browsers.

How to use this file

Use an example HTML file to test parsers, DOM construction, sanitization of untrusted markup, and rendering or scraping pipelines.

How to use this file for testing

“Pattern-Constraint Matrix (HTML)” is a deterministic Novus Examples fixture for Form testing, Form parsing, Autofill testing, HTML parsing. HTML and PDF form files for testing scrapers, autofill, validators, and PDF form fillers across real-life use cases.

Documented properties for this file: 8 fields. Compare results against paired or grouped companions on this page when present (clean↔damaged, searchable↔scanned, or format twins) so scores stay reproducible across runs.

Download the file once, keep the path stable in CI or local scripts, and treat the spec table as the contract: dimensions, seeds, field lists, and roles are intentional. Corrupt or invalid samples are labelled as such — expect parsers to fail loudly rather than silently accept them.

This form is fictional SAMPLE content for tooling tests (autofill, scrapers, PDF fillers). It is not an official government, bank, or clinic form. Open the HTML offline or fill the PDF in any viewer; the demo submit path never stores data.

Embed this form

It's a single self-contained HTML file (inlined CSS, native validation, no external requests). Download it, host it on your own site, and drop it into any page with an iframe.

iframe embed
<!-- Download pattern-constraint-matrix.html, host it on your site, then embed the form anywhere: -->
<iframe
  src="/path/to/pattern-constraint-matrix.html"
  title="Pattern-Constraint Matrix (HTML)"
  width="100%"
  height="640"
  loading="lazy"
  style="border:0">
</iframe>

Generated by generation/forms_p7.py. Free for any use, no attribution required — license.