Hallo!
Diesmal moechte ich ein Problem posten, das ich schon geloest habe. Aber eine Frage habe ich trotzdem noch dazu. Es geht um einen regulaeren Ausdruck in Perl.
Hintergrund: Fuer meinen Counter will ich von der URL des Referrers das Protokoll und den Server entfernen. Sprich: Aus 'http://www.domain.com/directory/index.html' soll '/directory/index.html' werden.
OK, mal sehn. Das allgemeine Search/Replace-Konstrukt ist s/such/ersetz/[opt].
Wir suchen also nach ein paar Buchstaben, gefolgt von einem Doppelpunkt: s/[a-z]+:
Dahinter zwei Schraegstriche: s/[a-z]+://
Gefolgt von beliebigen Zeichen (der Server), beendet mit einem /: s/[a-z]+://.+/
Jetzt der Ersetzungsausdruck, das ist ein /, der mit \ maskiert werden muss, dieses eingebettet in zwei / fuer
die Perl-Syntax: s/[a-z]+://.+////
Zuletzt die Optionen fuer wiederholtes ersetzten und Ignore Case: s/[a-z]+://.+////gi
Fertig! (more infos fuer regulaere Ausdruecke bei <../../tgcg.htm>.)
Fertig? Noch nicht ganz. Mit 'http://www.domain.com/index.html' funktioniert das ganz gut, da wird '/index.html' zurueckgeliefert. Aber mit 'http://www.domain.com/directory/index.html' kommt auch nur '/index.html' raus! Problem: Der Ausdruck sucht immer das letzte / im String. Wie loesen. Keine Ahnung, aber ich erinnerte mich darin, dass dieses Problem im Forum schonmal aufgetreten ist. Siehe dazu <../1998_3/t00019.htm#a76> und Antwortbeitraege (alle von Stefan). Stefan erzaehlt dort, dass der Ausdruck zum Ersetzen der < > -Syntax so aussah:
$printbody =~ s/[[Ll]ink:(.*)]/<a href="\1">\1</a>/g;
Dieser Ausdruck hatte auch immer das LETZTE ] im Text gesucht, woraus der dort zu sehende Effekt resultiert. Nach der Korrektur ist das draus geworden:
$printbody =~ s/[[Ll]ink:(.*?)]/<a href="\1">\1</a>/g;
Einfach ein ? eingefuegt. Das ist alles?! Hab ich bei mir auch gemacht, und siehe da, es funktioniert:
$referrer = 'http://www.domain.com/directory/index.html';
$referrer =~ s/[a-z]+://.+?////gi;
print $referrer; # /directory/index.html
(BTW: Ich glaube die Unterscheidung, ob das L gross oder klein ist, hatte er vorher auch nicht drin, aber das soll hier egal sein.)
Jetzt frage ich mich nur noch: Warum? Was ist den an dem Fragezeichen so toll, dass er nicht mehr das LETZTE, sondern das NAECHSTE / sucht?
SELFHTML: Das Fragezeichen ? bedeutet in einem regulären Ausdruck: {{das Zeichen vor dem Fragezeichen} oder auch nicht}.
Das bezieht sich in diesem Fall dann wohl auf .+, also {{ein oder mehrere Zeichen} oder auch nicht}. Logisch klingt das fuer mich nicht. Ich kann mir nur vorstellen, dass der Interpreter damit ausgetrickst wird, also man sich seine interne Arbeitsweise zunutze macht, die da waere, das er im ersten Fall von hinten sucht, im zweiten Fall von vorn. Aber so richtig sauber ist das dann nicht.
Wie sieht's aus, was ist der wahre Grund?
Calocybe