Ankündigung

Einklappen
Keine Ankündigung bisher.

Regex und Lookbehind Assertions Problem

Einklappen

Neue Werbung 2019

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

  • Regex und Lookbehind Assertions Problem

    Guten Morgen allerseits,

    ich habe mal wieder ein kleines Problemchen mit Regex.

    Anforderung:

    Ich muss drei verschiedene Seitentypen untersuchen, LP, Portal ohne Parameter und Portal mit Paramter, dass dient zu Messzwecken.

    Seitentypen:

    1.) lp/page/03
    2.) eine_portalseite_ohne_params
    3.) eine_portalseite_mit_params?param=dsfsdf

    Mein Ziel.

    Ich will eine Portalseite herausfiltern anhand der URL die keine Paramter hat.

    Dazu mein Regex (regex-evulator) und habe da auch das Tut gelesen zu gewissen Themen.

    Mein Regex:
    Code:
    ^(?<!lp\/)\w+(?!\?)*$
    Dazu die Url bzw nur der Request Uri:
    Code:
    meine_portalseite_ohne_param
    Und hier teste ich das http://regexp-evaluator.de/evaluator/

    Zu den Assertions habe ich auch das hier gelesen http://regexp-evaluator.de/tutorial/assertions/

    Wenn ich nun den Regex da ausführe bekomme ich folgenden Fehler.

    Der Ausdruck kann so nicht ausgewertet werden. Folgender Fehler trat auf:
    NOTHING TO REPEAT AT OFFSET 19 ()
    Auch das habe ich da nachgelesen und da wird gesagt das man auf eine Assertion keine Quatifier ansetzen kann, aber das amche ich ja auch nicht, sondern ich maskiere das ja als ein ganz normales Textzeichen.

    Könnt ihr mir helfen den Regex richtig umzusetzen, bzw auch aufzeigen wo mein Fehler liegt?

    Der Regex hat das Ziel eine Text zu erkennen der nicht mit lp/ beginnt und darf auch kein Fragezeichen enthalten.

    Vielen Dank für eure Zeit und Mühe.

    Gruß der Litter

  • #2
    Es liegt auch nicht am Fragezeichen. Du hast die Assertion eingeklammert und dahinter den *-Quantifier. Aber warum überhaupt eine Assertion für "Text ohne Fragezeichen"? Dein Ausdruck besagt "Wort, das nicht von einem Fragezeichen gefolgt ist, und danach Ende des Strings". Wenn der String nach dem Wort zu Ende ist, kann ihm ohnehin kein Fragezeichen folgen und in der Klasse \w ist das Fragezeichen auch nicht enthalten. Du kannst die Assertion also einfach weglassen.

    Kommentar


    • #3
      @Fab

      vielen Dank für deine Hilfe, genau das war der Knackpunkt.

      Code:
      ^(?<!lp\/)\w+$
      und es funktioniert. Aber was ich nicht verstehe ist warum das mit dem Sternchen dahinter schief ging.
      Darf nach einer Lookahead Assertion nichts mehr an Zeichen kommen, weil das nach dem durchsuchten Text ausgeführt wird, oder warum kam da der Fehler?

      Kommentar


      • #4
        Weil sich der Stern rein von der Syntax her auf die Assertion beziehen würde und das macht, wie die Fehlermeldung schon sagt, keinen Sinn. Zeichen dürfen dahinter natürlich stehen, ansonsten würden die Lookahead-Assertions wenig Sinn machen. Ich verstehe auch ehrlich gesagt nicht, was der Stern dort bewirken sollte, meintest du vielleicht .*?

        Kommentar


        • #5
          Ja kann sein das ich das vermurkst habe. Vielen Dank jedenfalls auch für deine Erklärung.

          Ich dachte die Quantifiers würden sich nur innerhalb des Unterausdrucks, also in den runden Klammern auf die Assertions beziehen.

          Kommentar


          • #6
            Wenn du so etwas
            mypage/eine_portalseite_ohne_params
            ausschließt (und das tust du), dann reicht auch
            Code:
            ^\w+$

            Kommentar


            • #7
              Nun doch noch Komplikationen.

              Warum wird das nicht gematcht?

              auszuwertender String
              www.mein-portal.de/gfopo/dfgdfg
              Regex
              Code:
              www.mein-portal.de\/(?<!lp\/)\w+[^? ]$
              Wenn ich eingebe www.mein-portal.de/gfopo/ dann matcht er noch, sobald aber weitere Zeichen folgen nicht mehr.

              Woran liegt das?

              Kommentar


              • #8
                Warum drehst du den Spieß nicht einfach um?
                Code:
                ^(?=.*lp\/|.*\?).*$
                Ich kann auch nicht ganz nachvollziehen, warum du das mit einem Test machen musst.

                Kommentar


                • #9
                  Ich glaube, dir ist noch nicht klar, was \w ist. "/" ist gehört jedenfalls nicht zu den word characters, wird demzufolge auch nicht gematcht. Und was ist das denn jetzt:
                  Code:
                  [^? ]
                  Beliebiges Zeichen außer Fragezeichen und Leerzeichen am Ende?

                  Kommentar


                  • #10
                    Zitat von fab Beitrag anzeigen
                    Ich glaube, dir ist noch nicht klar, was \w ist. "/" ist gehört jedenfalls nicht zu den word characters, wird demzufolge auch nicht gematcht. Und was ist das denn jetzt:
                    Code:
                    [^? ]
                    Beliebiges Zeichen außer Fragezeichen und Leerzeichen am Ende?

                    Doch mittlerweile ist mir das klar das Sachen wie "/" oder ? nicht zu Wordcharcters gehören.

                    Trotzdem komme ich momentan nich weiter, denn so etwas funktioniert auch nicht.

                    Code:
                    (?<!lp\/)[a-z0-9\/\-\_^\?]*$
                    Wenn da am Anfang ein lp/ steht wird das, obwohl es das nicht soll mitgematcht, weil das durch das * ja wieder erlaubt ist.

                    Ich weis da im Moment wirklich grad nicht weiter.

                    Kommentar


                    • #11
                      Dann mach mal aus der Lookbehind-Assertion eine Lookahead-Assertion, du willst ja von der Startposition aus rechts prüfen, dass nicht "lp/" kommt. Lookbehind am Anfang ist genauso sinnlos wie Lookahead am Ende.

                      War mir bisher aber auch noch nicht aufgefallen, dass du da in die falsche Richtung guckst

                      Kommentar


                      • #12
                        Kein Bock mein Vorschlag aus #8 mal zu probieren?

                        Kommentar


                        • #13
                          Zitat von jspit Beitrag anzeigen
                          Kein Bock mein Vorschlag aus #8 mal zu probieren?
                          Habe ich schon, entschuldige das ich nicht darauf reagiert habe, war keine böse Absicht.

                          Dein Vorschlag passt nicht auf die Anforderungen und funktioniert deshalb leider auch nicht.

                          Fab hat den richtigen Tipp gegeben, ich habe in die falsche Richtung geguckt.

                          Das funktioniert:

                          Code:
                          (?!lp/)[a-z0-9/\-\_][^?]*$

                          Kommentar


                          • #14
                            Zitat von litterauspirna Beitrag anzeigen
                            Dein Vorschlag passt nicht auf die Anforderungen und funktioniert deshalb leider auch nicht.
                            Doch, nur mußt du das Ergebnis negieren, das meinte ich mit Spieß umdrehen. Der Ausdruck liefert mit preg_match eine 1, wenn irgendwo 'lp/' oder ein ? gefunden wird und eine 0, wenn es eine "eine_portalseite_ohne_params" ist.
                            Wie auch immer, wenn du jetzt eine Lösung hast ist ja gut.

                            Kommentar

                            Lädt...
                            X