Johannes Zeller: Regexps: Verschachtelungsproblem

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

--
ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
Selfcode bei http://emmanuel.dammerer.at/selfcode.html
  1. 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

    1. 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

      --
      ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
      Selfcode bei http://emmanuel.dammerer.at/selfcode.html
      1. 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

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
        1. 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

          --
          ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
          Selfcode bei http://emmanuel.dammerer.at/selfcode.html
          1. 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

            1. 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

              --
              ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
              Selfcode bei http://emmanuel.dammerer.at/selfcode.html
          2. 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

            --
            Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"