Alors, comment fonctionne un analyseur HTML? N'utilise-t-il pas des expressions régulières pour analyser?
Et bien non.
Si vous revenez dans votre cerveau à un cours de théorie du calcul, si vous en avez suivi un, ou un cours de compilateurs, ou quelque chose de similaire, vous vous souviendrez peut-être qu'il existe différents types de langages et de modèles de calcul. Je ne suis pas qualifié pour entrer dans tous les détails, mais je peux passer en revue quelques-uns des principaux points avec vous.
Le type le plus simple de langage et de calcul (à ces fins) est un langage régulier. Ceux-ci peuvent être générés avec des expressions régulières et reconnus avec des automates finis. Fondamentalement, cela signifie que les chaînes "d'analyse" dans ces langages utilisent l'état, mais pas la mémoire auxiliaire. Le HTML n'est certainement pas un langage courant. Si vous y réfléchissez, la liste des balises peut être imbriquée de manière arbitraire profondément. Par exemple, les tables peuvent contenir des tables et chaque table peut contenir de nombreuses balises imbriquées. Avec les expressions régulières, vous pourrez peut-être choisir une paire de balises, mais certainement rien imbriqué de manière arbitraire.
Un langage simple classique qui n'est pas régulier est correctement mis en correspondance entre parenthèses. Essayez comme vous le pouvez, vous ne pourrez jamais construire une expression régulière (ou un automate fini) qui fonctionnera toujours. Vous avez besoin de mémoire pour suivre la profondeur d'imbrication.
Une machine à états avec une pile pour la mémoire est la prochaine force du modèle de calcul. C'est ce qu'on appelle un automate push-down, et il reconnaît les langages générés par des grammaires sans contexte. Ici, nous pouvons reconnaître les parenthèses correctement appariées - en effet, une pile est le modèle de mémoire parfait pour cela.
Eh bien, est-ce suffisant pour HTML? Malheureusement non. Peut-être pour le super-duper soigneusement validé XML, en fait, dans lequel toutes les balises s'alignent toujours parfaitement. Dans le HTML réel, vous pouvez facilement trouver des extraits comme <b><i>wow!</b></i>
. Cela ne s'imbrique évidemment pas, donc pour l'analyser correctement, une pile n'est tout simplement pas assez puissante.
Le prochain niveau de calcul est constitué des langages générés par des grammaires générales et reconnus par les machines de Turing. Il est généralement admis que c'est effectivement le modèle de calcul le plus puissant qui soit - une machine à états, avec mémoire auxiliaire, dont la mémoire peut être modifiée n'importe où. C'est ce que peuvent faire les langages de programmation. C'est le niveau de complexité où vit le HTML.
Pour résumer tout ici en une phrase: pour analyser le HTML général, vous avez besoin d'un vrai langage de programmation, pas d'une expression régulière.
Le HTML est analysé de la même manière que les autres langages: le lexing et l'analyse. L'étape de lexing décompose le flux de personnages individuels en jetons significatifs. L'étape d'analyse assemble les jetons, à l'aide d'états et de mémoire, dans un document logiquement cohérent sur lequel il est possible d'agir.