Skip to content

PHP, Scope und wiedermal Spaß mit Regulären Ausdrücken

Seit einiger Zeit bereitet mir eine RegEx Kopfschmerzen. Der reguläre Ausdruck wird in meinem WikifyBlog-Plugin für WordPress eingesetzt und soll eigentlich Referenzen in externe Blogs durch konkrete Links ersetzen. Ich verwende dafür das Konstrukt

$text = preg_replace_callback($regex_wiki_extern, 'gungfu_wikify_extern_wiki', $text);

Wobei $regex_wiki_extern der RegEx ist und gungfu_wikify_extern_wiki eine Callback-Methode ist, die die Textersetzung durchführt.

Soweit, so gut. Wie bereits erwähnt hat es mir Kopfzerbrechen bereitet. Es funktioniert(e) nicht. Die letzten zwei Stunden habe ich dran gesessen. Jetzt weiss ich, warum $text nach Aufruf von preg_replace_callback immer leer war: Ich habe vergessen den RegEx in die global-Liste aufzunehmen. global veranlasst PHP eine Variable aus einem äußeren Scope zu ‘importieren’:

$someVar = "somevalue, maybe a string, or a regex";

function someFunction(someParam){
    global $someVar;

    /* use $someVar */
}

Wird $someVar nicht mit global in den Scope der Funktion eingebunden, wird eine neue Variable mit demselben Namen im lokalen (Funktions-)Scope angelegt und initialisiert. Man bekommt also keine Fehlermeldung. Das finde ich – seit fünf Minuten – ziemlich sch…lecht.

Zu meiner Verteidigung möchte ich anführen, dass die betreffende global-Liste im konkreten Code bereits ziemlich lang war und Variablen ‘importiert’, die alle ziemlich gleich aussehen. Naja.

Übrigens funktioniert der RegEx (/(?!{{3,}){{2}(?:([A-Za-z]+):)([A-Za-z]+.)?([w-_]+)(?:s+(.*?))?(?!}{3,})}{2}/). Wahrscheinlich tut er das schon seit langem… :-|

Eigentlich wollte ich über was recht praktisches schreiben, dafür habe ich jetzt aber keine Zeit mehr. Erwähnen möchte ich es aber schnell noch: RegexExtractor extrahiert (und konvertiert) RegEx aus PHP-Skripten in Python-Skripte. Ich verwende das dann zum automatisierten Testen der RegEx. Ich finde ziemlich cool, wie leicht sowas in Python geht.

Man könnte es als Ironie des Schicksals sehen, dass ich in dem Python-Script gerade die Möglichkeit verwende den lokalen Scope dynamisch zu erweitern. Mehr dazu aber in einem anderen Beitrag.

Post a Comment

Your email is never published nor shared. Required fields are marked *