regex / preg_match() mit Conditional Subpattern und Bezug

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • regex / preg_match() mit Conditional Subpattern und Bezug

    Hi,

    ich habe folgenden Syntax, der problemlos funktioniert (stark vereinfacht, modifier U im Einsatz):
    Code:
    <a(rea)? (.*)(?(1)>|>(.*)</a>)
    so gehts auch:
    Code:
    <(?:(a )|(area ))(.*)>(?(1)(.*)</a>)
    Alternativ dachte ich aber, dass das hier eigentlich auch gehen müsste:
    Code:
    <a(rea)? (.*)>(?!(1)(.*)</a>)
    Will aber komischerweise nicht. Kann ich die Bedingung auf die Art nicht negieren?

    Und was mich auch ein bissel nervt ist, dass "rea" im Ergebnis erscheint. Per ?: kann ich es nicht verhindern, weil dann die Bedingung auch keinen Bezug darauf nimmt.

    Wo ist der Wald?
    Zuletzt geändert von mgutt; 20.06.2009, 12:36.
    mein Honda Forum | meine Scripte

  • #2
    Bei den ersten beiden Varianten verwendest du ein if-then also ein conditional pattern.
    Bei der 3. Variante verwendest du hingegen ein negatives lookahead.
    Wenn du die 3. Variante umsetzen möchtest müsstest du sowas machen:
    PHP-Code:
    /<a(rea)? .*?>(?(1)|(?:.*?<\/a>))/is 

    Kommentar


    • #3
      Ein negatives Lookahead sieht doch so aus: ?<!

      Wenn ich das richtig sehe, dann muss ich im Endeffekt nur eine leere DANN-Bedinung lassen, also so:
      Code:
      <a(rea)? (.*)>(?(1)|(.*)</a>)
      In Deiner Schreibweise (hattest eine Klammer zu viel):
      Code:
      /<a(rea)? .*?>(?(1)|.*?<\/a>)/is
      Zuletzt geändert von mgutt; 20.06.2009, 14:22.
      mein Honda Forum | meine Scripte

      Kommentar


      • #4
        Nein, das ist ein lookbehind und nein die Klammer ist nicht zuviel.

        Kommentar


        • #5
          Stimmt.. hatte mich vertan. Ja ein lookahead ist ja auch beabsichtigt gewesen. Aber wenn ich die Anleitung richtig verstehe, kann man auf Referenzierungen keine extra Negierung/lookahead anwenden, weil die Zahl dann einfach nur als Zahl ausgewertet wird und nicht als Referenz.

          Was bewirkt die Klammer? Sie erscheint mir überflüssig, da die SONST-Regel vom Raum her zwischen | und ) definiert wird. Eine zusätzliche Klammer dazwischen ist meiner Ansicht nicht von Nöten (mal davon abgesehen ist bei meinen Tests kein Unterschied zu sehen).
          mein Honda Forum | meine Scripte

          Kommentar

          Lädt...
          X