Gerade habe ich neue Erfahrungen mit regulären Ausdrücken (RE) gemacht, die ich gerne teilen möchte.
Wie in Unittesten von regulären Ausdrücken beschrieben, verwende ich RE um das Verlinken von Seiten des DenkzeitWikis in Blogeinträgen der DenkZEIT zu realisieren. Der RE, der solche Verweise findet ist inzwischen recht – ehm – komplex. Deshalb habe ich ihn inzwischen auf mehrere Zeilen aufgeteilt und kommentiert. Glücklicherweise geht das.
(?:([A-Za-z]+):)? #match wiki (for InterMaps)
([A-Za-z]+.)? #match Wiki-Group
(
(?<![a-z_]) #do not match words that start with lower case letters
(?:[A-Z][a-z_]+)
(?:[A-Z][a-z_]*)+ #matching the central WikiWord
(?:#[wd]*)? #matching anchor, consisting of letters or digits
)
(?![^<]*?>| #NOT inside an element, like in <a href="SomePage.html">, not sure if necessary
#If something closes but has not been opened, it already was open...
(.*?</a>)) #do not match link-text containing wikiwords.
Damit Python mit diesem Ungetüm zurecht kommt, muss man beim Kompilieren das re.VERBOSE-Flag setzen:
re.compile(VerdammtLangerRegulärerAusdruck, re.VERBOSE)
So, das Python-Skript verwende ich, um die RE zu testen. Eingesetzt werden sie aber in einem PHP-Skript. Wie kriegt man das geregelt? In PHP haben RE die Form /regex/flags, eine Überlieferung aus alten Perl-Tagen. Das x-Flag entspricht dem re.VERBOSE-Flag von Python:
/VerdammtLangerRegulärerAusdruck/x
Und? Funktioniert nicht! Es hat einiges Kopfzerbrechen und Recherche gebraucht bis ich auf das Problem gestoßen bin: Im PHP-RE hat / eine besondere Bedeutung. Es begrenzt das Pattern. Dummerweise kommt im Ungetüm von oben ein / an einer ganz anderen Stelle ebenfalls vor: (.*?</a>) Also muss es an dieser Stelle escaped werden: (.*?</a>)
Glücklicherweise kommt Python auch mit dem Escape zurecht. Daher kann ich es im Python-Code lassen und brauche mich beim zukünftigen Kopieren des RE vom Python-Skript (in dem der RE getestet wird) in das PHP-Skript nicht mehr drum zu kümmen. Gut, dass ich weiss, dass es funktioniert. Dank Unittesten von regulären Ausdrücken.





Post a Comment