Alors par exemple, tu mets la balise .code--tag à chaque span, et .code--{{le nom de la balise}} pour pouvoir faire du formattage particulier
Ensuite tu as juste à avoir un tableau de balises genre
[{tag: 'html'}, {tag: 'p'}, {'tag': 'br', 'self-closing': true}]
Etc (j'ai mis un array d'objets et pas de string pour pouvoir mettre des options, si tu veux faire un truc plus complet, par exemple "self-closing" pour les balises auto-fermantes comme <br/>)
Ensuite, sur base de ce tableau tu peux faire une regex, par exemple :
/<((?:\/?html)|(?:\/?p)|(?:br\/))>/
(à toi de l'améliorer pour accepter les attributs, les espaces...)
Et après tu remplaces avec la regex, par exemple si elle trouve
</html>
Tu vois dans le premier groupe que ca commence avec un / donc c'est une balise de fin, et que la balise c'est html, donc tu remplaces en :
<span class="code--tag code--html code--end"></html></span>
(j'ai mis code--end pour montrer que c'est une fermeture, tu n'es pas obligé)
J'espère avoir été clair :)