Pas si facile. Vous ne pouvez pas utiliser directement un analyseur HTML car ce n'est pas du HTML valide, mais vous ne pouvez pas facilement lancer une regex sur l'ensemble, car les regex ne peuvent pas gérer l'imbrication ou d'autres complications HTML.
Probablement sur le meilleur que vous pourriez faire serait d'utiliser une regex pour trouver chaque structure de balisage, par exemple. Quelque chose comme:
<(\w+)(?:\s+[-\w]+(?:\s*(?:=\s*(?:"[^"]*"|'[^']*'|[^'">\s][^>\s]*)))?)*\s*>
|</(\w+)\s*>
|<!--.*?-->
Commencez par une liste vide de tags à ouvrir et une liste vide de tags à fermer. Pour chaque correspondance dans la chaîne, regardez les groupes 1 et 2 pour voir si vous avez une balise de début ou de fin. (Ou un commentaire que vous pouvez ignorer.)
Si vous avez une étiquette de début, vous devez savoir si elle doit être fermée, c'est-à-dire. si c'est l'un des tags de modèle de contenu EMPTY
comme <img>
. Si un élément est EMPTY
, il n'a pas besoin d'être fermé, vous pouvez donc l'ignorer. (Si vous avez XHTML, tout ceci est un peu plus simple.)
Si vous avez une balise de début, ajoutez le nom du point dans le groupe d'expressions rationnelles à la liste des balises à fermer. Si vous avez une balise de fin, supprimez une balise à la fin de la liste des balises à fermer (il doit s'agir du même nom de balise que là-dessus, sinon vous avez un balisage non valide. Dans la liste des étiquettes à fermer, ajoutez plutôt le nom de la balise à la liste des balises à ouvrir
Une fois que vous avez atteint la fin de la chaîne d'entrée, ajoutez les balises d'ouverture de balise la chaîne dans l'ordre inverse, et ajouter les balises de fermeture pour les balises-à-proximité de la fin, à nouveau dans l'ordre inverse
(Ouais, je suis en train d'analyser HTML avec regex. Si vous ne pouvez pas faire quelque chose pour éviter d'avoir déjà découpé votre balisage au milieu d'une balise, faites-le.)
tag html et regexp n'est pas vraiment une bonne idée –
Gosh, vraiment, pensez-vous? – bobince