Regex pour trouver les balises ouvertes, à l'exception des balises orpheline

Je veux trouver toutes les balises d’ouverture :

<p>
<a href="#">

Mais pas ceux-là :

<br />
<img src="/img.jpg" /> 
<hr class="foo" />

J’ai eu cette idée et je voulais m’assurer que j’avais bien compris. Je ne saisis que les lettres de a à z.

<([a-z]+) *[^/]*?>

Voici ce que je propose:

<([a-z]+)[^>]*(?<!/)>

(?< ! ... ) est (dans les regex de Perl) le look-behind négatif. Elle se lit comme suit : un <, puis un mot, puis tout ce qui n’est pas un >, dont le dernier ne peut être un /, suivi de >.

Notez que cela permet des choses comme <a/ > (tout comme la regex originale), donc si vous voulez quelque chose de plus restrictif, vous devez créer une expression régulière qui correspond aux paires d’attributs séparées par des espaces.

Testez ce regex en ligne.

Essayez:

<([^\s]+)(\s[^>]*?)?(?<!/)>

Elle est proche de la vôtre, mais le dernier > ne doit pas se situer après une /, et elle accepte également les h1. Voici un regex demo.

Quelques expressions régulières améliorées :

/(<.*?>|[^<]+)\s*/g    # Obtenir les balises et le texte
/(\w+)="(.*?)"/g       # Obtenir des attibutes

Elles sont bonnes pour XML / XHTML.