Il n'y a pas un jour sur SO qui passe sans qu'une question sur l'analyse (X)HTML ou XML avec des expressions régulières soit posée.
Alors qu'il est relativement facile de trouver des exemples démontrant la non-viabilité des regexes pour cette tâche ou une collection d'expressions pour représenter le concept, je n'ai toujours pas trouvé sur SO une explication formelle de pourquoi cela n'est pas possible expliqué de façon simple.
Les seules explications formelles que j'ai pu trouver jusqu'à présent sur ce site sont probablement extrêmement précises, mais aussi assez ésotériques pour le programmeur autodidacte :
l'erreur ici est que HTML est une grammaire de type 2 de Chomsky (grammaire contextuelle) et RegEx est une grammaire de type 3 de Chomsky (expression régulière)
ou :
Les expressions régulières ne peuvent correspondre qu'à des langages réguliers mais HTML est un langage de type libre.
ou :
Un automate fini (qui est la structure de données sous-jacente à une expression régulière) n'a pas de mémoire en dehors de l'état dans lequel il se trouve, et si vous avez un nidification arbitrairement profonde, vous avez besoin d'un automate arbitrairement grand, ce qui entre en collision avec la notion d'un automate fini.
ou :
La "pumping lemma" pour les langages réguliers est la raison pour laquelle vous ne pouvez pas faire cela.
[La plupart des explications ci-dessus renvoient à des pages de wikipedia, mais celles-ci ne sont pas beaucoup plus faciles à comprendre que les réponses elles-mêmes].
Quelle est une traduction en termes simples des explications formelles données ci-dessus sur pourquoi il n'est pas possible d'utiliser des regex pour l'analyse (X)HTML/XML ?
Je recherche une traduction qui explique également brièvement les concepts qu'elle tente de traduire : à la fin d'une réponse, le lecteur devrait avoir une idée approximative -- par exemple -- de ce que signifient "langage régulier" et "grammaire contextuelle".
24 votes
Soyez conscient du fait qu'en termes de science informatique, les "expressions régulières" diffèrent beaucoup des "implémentations regex" modernes (les outils/api que vous utilisez dans un langage de programmation). Ces derniers peuvent "se souvenir" des choses qu'ils ont rencontrées et peuvent même correspondre à des motifs (sous-)définis de manière récursive, ce qui leur permet de correspondre/analyser/reconnaître beaucoup plus que les "expressions régulières" théoriques.
1 votes
@Bart : Cela s'applique vraiment uniquement aux langages qui abusent du terme "expression régulière". Les ERE POSIX sont purement régulières.
3 votes
@R.., donc, tu qualifies POSIX d'une "implémentation moderne" :P. En toute sincérité cependant : oui, tu as raison, ceux-ci sont vraiment des réguliers. J'aurais dû dire "... bon nombre des implémentations regex modernes ..." ou "... les implémentations regex PCRE ..." .
5 votes
J'ai du mal à prendre au sérieux les langages de programmation qui utilisent fondamentalement le langage rigoureux à des fins de marketing auprès des programmeurs ignorants...
4 votes
@R.., il est regrettable que les implémentations PCRE soient appelées "expressions régulières", mais ne pas prendre au sérieux le langage est aller un peu trop loin, à mon avis. Je veux dire, est-ce que vous ne prenez pas Perl, Java, Python, Ruby, JavaScript, .NET, etc. au sérieux à cause de cela?
0 votes
Comme @Bart Kiers le mentionne correctement; la prémisse de cette question est fausse: Il est possible d'utiliser "regex" pour analyser du HTML/XML! - (ce n'est simplement pas recommandé de le faire dans la plupart des cas). Tom Christiansen (@tchrist - l'un des auteurs du classique: Programming Perl livre), explique ceci de la manière la plus élégante dans une collection de ses messages détaillés ici sur SO - commencez à lire ici: Les implémentations regex étendues peuvent-elles analyser du HTML?. Les moteurs regex modernes NE SONT PAS REGULIERS!
0 votes
Je sais que c'est une question vraiment ancienne, mais il est bon de noter ici en tant qu'information générale que HTML (et XML) n'est même pas contextuel: c'est contexte-sensible car la validité des balises de fermeture dépend en partie de la valeur analysée des balises d'ouverture elles-mêmes.
0 votes
Cette
Pourquoi il n'est pas possible d'utiliser des regex pour analyser du HTML/XML : une explication formelle en termes simples
n'est pas un doublon de cette question stackoverflow.com/questions/59204800/…. Ce n'est pas une vraie question, c'est un traité fondé sur l'opinion qui ne devrait pas être utilisé pour masquer l'analyse des balises regex dans du HTML/XML ou tout SGML. Si cela est vrai, alors plus de 100 000 questions SO doivent également être masquées ! Les questions des utilisateurs ne doivent pas être bloquées pour des réponses juste pour soutenir la théorie académique, SO n'est pas un endroit pour cela. Les regex ne sont pas des vilains ici.0 votes
@user12097764 Votre estimation semble un peu élevée; mais oui, il y a beaucoup, beaucoup de questions sur Stack Overflow qui devraient être fermées ou même supprimées selon les critères d'aujourd'hui. Certaines d'entre elles restent simplement parce qu'elles ne sont pas dangereuses, tant que les gens ne croient pas que ces questions sont de bons modèles pour savoir comment poser une nouvelle question. D'autres devraient effectivement être supprimées, mais c'est un processus lent et ardu pour les trouver toutes, et il se peut qu'il n'y ait pas suffisamment de visiteurs sérieux prêts à accepter le mandat pour aider à modérer le site.
0 votes
Le deuxième lien est la célèbre réponse d'expression régulière sur Stack Overflow (analyse HTML).