Take: Regexp: Unmatched Parentheses - WTF?

Moin,

die spinnen die Leute, die RegExp's toll finden...
Also:

ich versuche aus einem String der HTML-Attribute-mäßig (name="value" name2="value2") aufgebaut ist die name-value paare auszulesen.
Erster Versuch:
[[a-zA-Z0-9_]+\="[^"]+"]*
Funktioniert. :)

Jetzt will ich name und value einzeln haben:
[([a-zA-Z0-9_]+)\="([^"]+)"]*
"Unmatched parenteses" spuckt PHP aus.

Das hier funktioniert aber wieder einwandfrei:
[[a-zA-Z0-9_]+\="([^"]+)"]*

Warum will er denn die ersten runden Klammern nicht?

Danke schonmal und gruß,
Take

  1. Hi,

    Jetzt will ich name und value einzeln haben:
    [([a-zA-Z0-9_]+)\="([^"]+)"]*
    "Unmatched parenteses" spuckt PHP aus.

    Du öffnest mit der ersten [ eine Zeichenklasse, die die Zeichen (, [, Buchstaben, Ziffern und den Unterstrich enthält, dann schließt du diese Zeichenklasse mit ] wieder. Danach kommt der Quantifier +, und danach eine runde Klammer ), zu der es keine öffnende gibt.

    Eckige Klammern mögen im Sonderangebot gewesen sein, aber du solltest sie trotzdem sparsamer verwenden.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Moin,

      Hi,

      Jetzt will ich name und value einzeln haben:
      [([a-zA-Z0-9_]+)\="([^"]+)"]*
      "Unmatched parenteses" spuckt PHP aus.

      Du öffnest mit der ersten [ eine Zeichenklasse, die die Zeichen (, [, Buchstaben, Ziffern und den Unterstrich enthält, dann schließt du diese Zeichenklasse mit ] wieder. Danach kommt der Quantifier +, und danach eine runde Klammer ), zu der es keine öffnende gibt.

      Warum zum Teufel muss man demn die Klammern nicht escapen? Das meinte ich mit meinem einleitenden Satz :(

      Eckige Klammern mögen im Sonderangebot gewesen sein, aber du solltest sie trotzdem sparsamer verwenden.

      Eigentlich nicht, ich hab ne Deutsche Tastatur, da sind eckige und geschweifte Klammern ein Gräuel. :D

      Jedenfalls war das der entscheidende Hinweis, vielen Dank! Dieses Konstrukt diente dazu, dass mehrere name-value-Paare erlaubt sind (deswegen das *), was ja totaler Quatsch ist, weil ein RegEx auch mehrfach matcht.

      Also:

      ([a-zA-Z0-9_]+)\="([^"\<\>]+)"

      MfG ChrisB

      Gruß,
      Take

      1. Hi,

        Jetzt will ich name und value einzeln haben:
        [([a-zA-Z0-9_]+)\="([^"]+)"]*
        "Unmatched parenteses" spuckt PHP aus.

        Du öffnest mit der ersten [ eine Zeichenklasse, die die Zeichen (, [, Buchstaben, Ziffern und den Unterstrich enthält, dann schließt du diese Zeichenklasse mit ] wieder. Danach kommt der Quantifier +, und danach eine runde Klammer ), zu der es keine öffnende gibt.

        Warum zum Teufel muss man demn die Klammern nicht escapen?

        Welche - die runden?
        Na *weil* du dich innerhalb der Zeichenklasse in einem Bereich befindest, in dem sie keine Sonderbedeutung haben, sondern einfach nur runde Klammern *sind*.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Moin,

          Warum zum Teufel muss man demn die Klammern nicht escapen?

          Welche - die runden?

          Beide. Die erste Zeichenklasse meines ersten RegEx bestand ja aus (, [, a-z, usw.

          Na *weil* du dich innerhalb der Zeichenklasse in einem Bereich befindest, in dem sie keine Sonderbedeutung haben, sondern einfach nur runde Klammern *sind*.

          Naja, in HTML muss man in URLS &, ", ' usw. auch escapen. Nur weil man jetzt gerade in einem href oder src-Attribut ist, ist doch folgendes nicht korrekt:
          <a href="http://example.com/?foo=bar&foo2=bar2"> sondern es muss <a href="http://example.com/?foo=bar&amp;foo2=bar2"> heißen. Das & wird escaped. Oder bringe ich da jetzt alles durcheinander?

          MfG ChrisB

          Gruß,
          Take

          1. Hi,

            Naja, in HTML muss man in URLS &, ", ' usw. auch escapen. Nur weil man jetzt gerade in einem href oder src-Attribut ist, ist doch folgendes nicht korrekt:
            <a href="http://example.com/?foo=bar&foo2=bar2"> sondern es muss <a href="http://example.com/?foo=bar&amp;foo2=bar2"> heißen. Das & wird escaped.

            Logisch - weil der Kontext nach wie vor den Namen HTML trägt, und dessen Regeln das nun mal erfordern.

            Oder bringe ich da jetzt alles durcheinander?

            Du versuchst ein Beispiel an den Haaren herbei zu ziehen, dass sich schreiend und tretend dagegen wehrt :-)

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Moin,

              Hi,

              Naja, in HTML muss man in URLS &, ", ' usw. auch escapen. Nur weil man jetzt gerade in einem href oder src-Attribut ist, ist doch folgendes nicht korrekt:
              <a href="http://example.com/?foo=bar&foo2=bar2"> sondern es muss <a href="http://example.com/?foo=bar&amp;foo2=bar2"> heißen. Das & wird escaped.

              Logisch - weil der Kontext nach wie vor den Namen HTML trägt, und dessen Regeln das nun mal erfordern.

              Aber beim Regex ist der Kontext doch auch immernoch RegEx, oder?

              Oder bringe ich da jetzt alles durcheinander?

              Du versuchst ein Beispiel an den Haaren herbei zu ziehen, dass sich schreiend und tretend dagegen wehrt :-)

              HTML ist nicht böse. HTML ist toll, im Gegensatz zu RegEx, das tritt nicht :D

              MfG ChrisB

              Gruß,
              Take

              1. @@Take:

                nuqneH

                Aber beim Regex ist der Kontext doch auch immernoch RegEx, oder?

                Bei einer Zeichenklasse im RegEx ist der Kontext Zeichenklasse.

                Qapla'

                --
                Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                (Mark Twain)
                1. Moin,

                  @@Take:

                  nuqneH

                  Aber beim Regex ist der Kontext doch auch immernoch RegEx, oder?

                  Bei einer Zeichenklasse im RegEx ist der Kontext Zeichenklasse.

                  Naja ich nehms jetzt so hin. aber ich verstehe immer noch nicht, warum in einem href-Attribut dann der Kontext nicht URL ist. :( Ist auch egal. Jetzt ist erstmal Ostern :D

                  Qapla'

                  Gruß,
                  Take

                  1. Hi,

                    aber ich verstehe immer noch nicht, warum in einem href-Attribut dann der Kontext nicht URL ist.

                    Ist er (genauer: URI). Aber erst nach dem vorgelagerten Kontext HTML.

                    Kontexte können verschachtelt werden.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. @@ChrisB:

                      nuqneH

                      Ist er (genauer: URI). Aber erst nach dem vorgelagerten Kontext HTML.

                      Kontexte können verschachtelt werden.

                      Im URI gibt es bspw. den Kontext Query, auch dort hat '&' eine Sonderbedeutung (Trennzeichen zwischen Parametern): ?foo=…&quz=…

                      Enthält ein Wert nun '&' ('bar&baz'), muss dieses escapet werden, in diesem Kontext als '%26': ?foo=bar%26baz&quz=

                      Im XML-/HTML-Kontext muss das verbliebene '&' escapet werden ('&#x26;' oder '&amp;'*): <a href='…?foo=bar%26baz&#x26;quz=…'> oder <a href='…?foo=bar%26baz&amp;quz=…'>

                      Qapla'

                      * '&#38;' sollte man nicht verwenden

                      --
                      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                      (Mark Twain)
  2. [latex]Mae  govannen![/latex]

    Jetzt will ich name und value einzeln haben:
    [([a-zA-Z0-9_]+)\="([^"]+)"]*
    "Unmatched parenteses" spuckt PHP aus.

    Richtig. Die schließende Klammer hinter dem ersten "+" hat keine öffnende Entsprechung. Warum du gleichzeitig auf eine öffnende Klammer als Zeichen matcht, versteh ich ebenfalls nicht *g*

    Stur lächeln und winken, Männer!
    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
    in Richtung "Mess up the Web".(suit)
    SelfHTML-Forum-Stylesheet
  3. @@Take:

    nuqneH

    die spinnen die Leute, die RegExp's toll finden...

    Sie sind toll. Wenn man sie sinnvoll einsetzt.

    ich versuche aus einem String der HTML-Attribute-mäßig (name="value" name2="value2") aufgebaut ist die name-value paare auszulesen.

    Da waren sie wieder, meine zwei Probleme.

    Was heißt „HTML-Attribute-mäßig“? Der String* name\t= "value"\nname2\t= 'value2' ist auch HTML-Attribute-mäßig, wird aber von deinem Ausdruck nicht erkannt.

    Qapla'

    * sieht so aus:

    name    = "value"  
    name2   = 'value2'
    
    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Moin,

      @@Take:

      nuqneH

      ich versuche aus einem String der HTML-Attribute-mäßig (name="value" name2="value2") aufgebaut ist die name-value paare auszulesen.

      Was heißt „HTML-Attribute-mäßig“? Der String* name\t= "value"\nname2\t= 'value2' ist auch HTML-Attribute-mäßig, wird aber von deinem Ausdruck nicht erkannt.

      Ich habe geschwankt, ob ich "mäßig" oder "ähnlich" schreibe. Jetzt weiß ich: ähnlich wäre besser gewesen...

      Qapla'

      Gruß,
      Take