Rexact
Cheatsheet

Regex HTML tag

Stack Overflow's most famous answer (4,400 votes, locked) says it plainly: nested HTML cannot be parsed with a regex, it isn't a regular language. But recognizing a single, isolated tag — not a whole document — remains a legitimate use case. Here's a pattern for that, compared against the 235-vote catch-all regex and the question's own attempt, which our ReDoS analysis flags as vulnerable.

/^<([a-zA-Z][a-zA-Z0-9]*)((?:\s+[a-zA-Z-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'))?)*)\s*(\/)?>$/
passes 20/20 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^<([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[a-zA-Z-]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'))?)*)\\s*(\\/)?>$", "");
re.test(input);

Limits

  • Ne reconnaît qu'UNE balise isolée, jamais un document imbriqué : c'est précisément ce que la réponse la plus votée de tous les temps sur Stack Overflow (4400+ votes) explique en détail — HTML n'est pas un langage régulier, une regex ne peut pas suivre l'imbrication de balises ouvertes/fermées.
  • Ne reconnaît pas les balises fermantes (« </p> ») ni les déclarations spéciales (commentaires, DOCTYPE) : un motif séparé est nécessaire pour chacune.
  • N'exécute aucune validation sémantique : une balise avec un nom qui n'existe pas en HTML (« <foo> ») ou un attribut invalide pour cet élément passe très bien, car ce n'est pas une question de forme.
  • Pour un usage réel sur du HTML produit par un tiers (page web, contenu utilisateur), un vrai parseur HTML/DOM reste la seule option fiable — cette regex convient à un cas contrôlé et limité (ex. extraire une donnée d'un gabarit HTML que tu maîtrises toi-même), pas à du grattage de pages arbitraires.