Regexps: Verschachtelungsproblem
Johannes Zeller
- php
Hallo zusammen
Ich benutze folgendes Regexp um maskierte Zeichen wie %2F aus URLs herasuzufiltern:
preg_match("/[\w(%[\da-fA-F]{2})]*/", "test%2Fwert");
Dabei bekomme ich als Fehlermeldung:
Warning: Compilation failed: unmatched parentheses at offset 18 in /var/www/html/test2.php on line 2
Kann mir jemand sagen, was das bedeutet und wie ich es so hinkriegen kann, dass es funktioniert?
Schon im vorraus vielen Dank
Johannes
hi Johannes!
Ich benutze folgendes Regexp um maskierte Zeichen wie %2F aus URLs herasuzufiltern:
was meinst du mit "herausfiltern" genau? moechtest du nur einen url dekodieren? dann schau mal auf http://www.selfphp.info/funktionsreferenz/url_funktionen/urldecode.php.
prost
seth
Hi seth
Ich benutze folgendes Regexp um maskierte Zeichen wie %2F aus URLs herasuzufiltern:
was meinst du mit "herausfiltern" genau? moechtest du nur einen url dekodieren? dann schau mal auf http://www.selfphp.info/funktionsreferenz/url_funktionen/urldecode.php.
Der Ausdruck herausfiltern war wohl etwas unglücklich gewählt. Eigentlich will ich überprüfen ob ein String eine gültige HTTP-URL ist. Das von mir gepostete Regexp ist natürlich nur ein Anfang.
Trotzdem Danke
Johannes
Moin Moin !
Der Ausdruck herausfiltern war wohl etwas unglücklich gewählt. Eigentlich will ich überprüfen ob ein String eine gültige HTTP-URL ist. Das von mir gepostete Regexp ist natürlich nur ein Anfang.
http://ucan.foad.org/~abigail/Perl/url2.html und diverse andere über Google. Warum immer wieder das Rad neu erfinden?
Zur Fehlermeldung: In "" findet auch in PHP Variablen-Interpolation statt, oder? Du wirst wohl noch ein paar \ einstreuen müssen.
Alexander
Hallo Alexander
http://ucan.foad.org/~abigail/Perl/url2.html und diverse andere über Google. Warum immer wieder das Rad neu erfinden?
Ich bin eigentlich noch ein Einsteiger in PHP und hab das auch selber gemacht um mich mal in Regexp einzuarbeiten, "learning by doing" quasi.
Zur Fehlermeldung: In "" findet auch in PHP Variablen-Interpolation statt, oder? Du wirst wohl noch ein paar \ einstreuen müssen.
Nein, das mit dem Prozentzeichen hat schon seine Richtigkeit. In Perl wird das ja AFAIK für Hashes verwendet, aber in PHP fangen alle Variablen mit $ an.
Ich hab das jetzt übrigens gelöst. Es lag irgendwie an der Verschachtelung der eckigen Klammern. Statt
preg_match("/[\w(%[\da-fA-F]{2})]*/", "test%2Fwert");
habe ich nun:
preg_match("/(\w|(%[\da-fA-F]{2}))*/", "test%2Fwert");
gemacht und plötzlich funktioniert es. Weiß vielleicht jemand woran das liegt?
Schöne Grüße und vielen Dank
Johannes
Hallo Johannes,
[... verschachtelte Zeichenklassen ...]
Weiß vielleicht jemand woran das liegt?
Man kann keine Zeichenklassen in Zeichenklassen definieren. Die
eckigen Klammern sind keine Oder-Operatoren, sie definieren
nur Zeichenklassen. Und eine Zeichenklasse in einer
Zeichenklasse ist nunmal nicht erlaubt.
Gruesse,
CK
Hallo Christian
Man kann keine Zeichenklassen in Zeichenklassen definieren. Die
eckigen Klammern sind keine Oder-Operatoren, sie definieren
nur Zeichenklassen. Und eine Zeichenklasse in einer
Zeichenklasse ist nunmal nicht erlaubt.
So ist es eigentlich logisch. Ich hatte das mit den Zeichenklassen nicht richtig verstanden.
Schöne Grüße
Johannes
Moin Moin !
Hallo Alexander
http://ucan.foad.org/~abigail/Perl/url2.html und diverse andere über Google. Warum immer wieder das Rad neu erfinden?
Ich bin eigentlich noch ein Einsteiger in PHP und hab das auch selber gemacht um mich mal in Regexp einzuarbeiten, "learning by doing" quasi.
Mal so am Rande: Die URL-Regexp ist sowas um 8 KB groß und immer noch nicht perfekt.
Ich hab das jetzt übrigens gelöst. Es lag irgendwie an der Verschachtelung der eckigen Klammern. Statt
preg_match("/[\w(%[\da-fA-F]{2})]*/", "test%2Fwert");
habe ich nun:
preg_match("/(\w|(%[\da-fA-F]{2}))*/", "test%2Fwert");
gemacht und plötzlich funktioniert es. Weiß vielleicht jemand woran das liegt?
Klar. [] sind "character classes" und keine Gruppierungen. [] kann man *so* nicht verschachteln.
http://www.perldoc.com/perl5.8.0/pod/perlrequick.html - RE quick reference
http://www.perldoc.com/perl5.8.0/pod/perlretut.html - RE tutorial
http://www.perldoc.com/perl5.8.0/pod/perlre.html - RE generell
http://www.php.net/manual/en/ref.pcre.php - PHPs version von Perls REs
http://www.google.com/search?q=perl+cookbook - Perl Cookbook, auf diversen Russischen Seiten auch komplett zu finden, viele Rezepte für REs.
Alexander