PHP

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Mit dem Web-Boom der späten Neunziger wurde PHP sehr bekannt und ist es bis heute. Der Hauptgrund für seine Beliebtheit ist wahrscheinlich der, dass auch Anfänger ohne große Einarbeitung sehr schnell mit PHP etwas auf die Beine stellen können. PHP bietet aber auch dem erfahreneren Entwickler ein Füllhorn von Funktionen und Möglichkeiten. PHP kennt natürlich reguläre Ausdrücke, und nicht nur das, es enthält nicht weniger als drei separate, unabhängige Regex-Maschinen.

Die drei Regex-Maschinen in PHP heißen »preg«, »ereg« und »mb_ereg«. In diesem Buch wird aber nur die preg-Funktionsfamilie behandelt. Sie enthält eine NFA-Maschine, die sowohl in der Leistung als auch im Funktionsumfang den anderen beiden überlegen ist. »preg« wird meist wie »P-Reg« ausgesprochen.

In diesem Kapitel

Bevor wir uns dem Inhalt dieses Kapitels zuwenden, möchte ich betonen, dass es auf dem Grundlagenmaterial der Kapitel Einführung in reguläre Ausdrücke bis Die Kunst, reguläre Ausdrücke zu schreiben aufbaut. Ich kann verstehen, dass an PHP interessierte Leser sich auf dieses Kapitel stürzen wollen, ich möchte sie aber dazu ermuntern, aus den vorherigen Kapiteln ihren Nutzen zu ziehen: aus dem Vorwort (insbesondere die typografischen Konventionen), aus den Kapiteln Einführung in reguläre Ausdrücke bis Features und Dialekte, in denen Grundlagen und Anwendungen erarbeitet werden, aus den Kapiteln Wie Regex-Maschinen arbeiten bis Die Kunst, reguläre Ausdrücke zu schreiben, in denen die Arbeitsweise der Regex-Maschine erläutert wird, die direkt Bezug auf die preg-Maschine von PHP hat. Zu den grundlegenden Konzepten gehören die Arbeitsweise einer Regex-Maschine vom NFA-Typus bei einem Match-Versuch, das gierige Verhalten der Maschine, Backtracking und die Überlegungen zur Effizienz von regulären Ausdrücken.

Ich möchte außerdem betonen, dass dieses Buch nicht als Nachschlagewerk gedacht ist, auch wenn die Tabellen Elemente von regulären Ausdrücken im preg-Paket von PHP – Übersicht oder in früheren Kapiteln In diesem Abschnitt behandelte Konstrukte und Grundlegende Unter-Eigenschaften in Unicode diesen Anschein erwecken. Vielmehr ist es mein Anliegen, den Leser dazu zu bringen, in regulären Ausdrücken zu denken.

Das Kapitel beginnt mit ein paar Bemerkungen zur historischen Entwicklung der preg-Maschine und beschreibt dann ihren Regex-Dialekt. In den späteren Abschnitten werden die einzelnen Funktionen im Detail behandelt, und es wird auf besondere Effizienzprobleme dieser Maschine hingewiesen. Das Kapitel schließt mit ein paar ausführlichen Beispielen.

Hintergrund und historische Entwicklung

Der Name »preg« wird als Präfix für alle Funktionsnamen des Pakets verwendet und bedeutet eigentlich »Perl Regular Expressions«. Diese Funktionsfamilie wurde von Andrei Zmievski hinzugefügt, der sich über die Unzulänglichkeit des damals bestehenden ereg-Pakets ärgerte (»ereg« bedeutet »Extended Regular Expressions«, es handelt sich um eine POSIX-Implementation, die nur im Vergleich zu den allereinfachsten Mitbewerbern »erweitert« genannt werden kann; nach heutigem Standard ist sie doch sehr beschränkt).

Andrei hat dazu im Wesentlichen eine Schnittstelle für PHP zu PCRE (»Perl Compatible Regular Expressions«) geschrieben. PCRE ist eine hervorragende Regex-Bibliothek in C, die eine NFA benutzt und die in Syntax und Funktion sehr eng an die Implementation des Vorbilds Perl angelehnt ist.

Bevor er sich für PCRE entschieden hat, hat sich Andrei den Quellcode der Perl-Implementation sehr genau angeschaut, um herauszufinden, ob sich daraus etwas für PHP verwerten ließe. Er hat aber, wie viele andere, feststellen müssen, dass dies kaum praktikabel ist. Die Regex-Maschine von Perl ist zwar für den Benutzer sehr einfach zu handhaben, aber an der Implementation haben über die Jahre so viele Entwickler mitgearbeitet, dass es für einen Einzelnen schier unmöglich ist, den Code zu verstehen.

Früher schon hatte Philip Hazel von der University of Cambridge in England ein ähnliches Erlebnis mit dem Perl-Quellcode und hatte für seine eigenen Zwecke die PCRE-Bibliothek geschrieben (siehe auch Eine Flurbereinigung bei den Regex-Dialekten). Im Gegensatz zu den Perl-Entwicklern hatte er exakte Vorgaben, wie das Resultat auszusehen hatte, und konnte seinen Code von Grund auf sauber strukturiert aufbauen. Andrei fand deshalb ein paar Jahre später sauber geschriebenen, gut dokumentierten und leistungsfähigen Code vor, den er in PHP einbauen konnte.

Weil sich PCRE getreu dem Vorbild von Perl weiterentwickelt, gibt es auch von diesem Paket verschiedene Versionen. Dieses Buch behandelt die PHP-Versionen 4.4.3 und 5.1.4, die beide die Version 6.6 von PCRE enthalten. (Anmerkung: Bei den Untersuchungen für dieses Kapitel mit früheren Versionen von PHP und PCRE bin ich auf eine Anzahl von Bugs gestoßen, die in den Versionen 4.4.3 und 5.1.4 alle behoben sind. Es kann sein, dass bestimmte hier gezeigte Beispiele mit früheren Versionen nicht funktionieren.)

Falls Sie mit dem Versionierungsschema von PHP nicht vertraut sind: Die Reihen 4.x und 5.x werden nebeneinander entwickelt, wobei die 5.x-Reihe eine Neuimplementation ist. Weil die Entwicklung der zwei Reihen unabhängig voneinander verläuft, kann es mitunter passieren, dass eine 5.x-Version eine ältere PCRE-Bibliothek enthält als eine 4.x-Version.

  

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln