Wie funktioniert ein HTML-Parser? Verwendet es keine regulären Ausdrücke zum Parsen?
Nun, nein.
Wenn Sie in Ihrem Gehirn auf einen Kurs zur Theorie der Berechnung zurückgreifen, wenn Sie einen Kurs oder einen Compilerkurs oder ähnliches belegt haben, können Sie sich daran erinnern, dass es verschiedene Arten von Sprachen und Rechenmodellen gibt. Ich bin nicht qualifiziert, auf alle Details einzugehen, aber ich kann einige der wichtigsten Punkte mit Ihnen besprechen.
Die einfachste Art von Sprache und Berechnung (für diese Zwecke) ist eine reguläre Sprache. Diese können mit regulären Ausdrücken generiert und mit endlichen Automaten erkannt werden. Grundsätzlich bedeutet dies, dass das "Parsen" von Zeichenfolgen in diesen Sprachen den Status, jedoch nicht den Hilfsspeicher verwendet. HTML ist sicherlich keine reguläre Sprache. Wenn Sie darüber nachdenken, kann die Liste der Tags beliebig tief verschachtelt werden. Beispielsweise können Tabellen Tabellen enthalten, und jede Tabelle kann viele verschachtelte Tags enthalten. Mit regulären Ausdrücken können Sie möglicherweise ein Paar Tags auswählen, aber sicherlich nichts, was willkürlich verschachtelt ist.
Eine klassische einfache Sprache, die nicht regulär ist, besteht aus korrekt übereinstimmenden Klammern. Versuchen Sie es wie Sie möchten, Sie werden niemals in der Lage sein, einen regulären Ausdruck (oder einen endlichen Automaten) zu erstellen, der immer funktioniert. Sie benötigen Speicher, um die Verschachtelungstiefe zu verfolgen.
Eine Zustandsmaschine mit einem Stapel für Speicher ist die nächste Stärke des Rechenmodells. Dies wird als Push-Down-Automat bezeichnet und erkennt Sprachen, die durch kontextfreie Grammatiken generiert werden. Hier können wir korrekt übereinstimmende Klammern erkennen - tatsächlich ist ein Stapel das perfekte Speichermodell dafür.
Ist das gut genug für HTML? Traurigerweise Nein. Vielleicht für Super-Duper sorgfältig validiertes XML, in dem alle Tags immer perfekt ausgerichtet sind. In echtem HTML können Sie leicht Schnipsel wie finden<b><i>wow!</b></i>
. Dies ist offensichtlich nicht verschachtelt. Um es richtig zu analysieren, ist ein Stapel einfach nicht leistungsfähig genug.
Die nächste Rechenebene sind Sprachen, die von allgemeinen Grammatiken generiert und von Turing-Maschinen erkannt werden. Es wird allgemein angenommen, dass dies das stärkste Rechenmodell ist, das es gibt - eine Zustandsmaschine mit Hilfsspeicher, deren Speicher überall geändert werden kann. Dies können Programmiersprachen. Dies ist der Grad der Komplexität, in dem HTML lebt.
Um hier alles in einem Satz zusammenzufassen: Um allgemeines HTML zu analysieren, benötigen Sie eine echte Programmiersprache, keinen regulären Ausdruck.
HTML wird genauso analysiert wie andere Sprachen: Lexing und Parsing. Der Lexing-Schritt zerlegt den Strom einzelner Zeichen in aussagekräftige Token. Der Analyseschritt fasst die Token unter Verwendung von Status und Speicher zu einem logisch zusammenhängenden Dokument zusammen, auf das reagiert werden kann.