Micha: Zeichekette suchen und andere dabei ausschließen

Hallo,

ich suche nach einem regulären Ausdruck um aus einer Adresse nur dann eine ID auszulesen, wenn die Zeichenkette "mode=page" nicht darin vorkommt.

Beispiel: Bei der URL http://example.org/foo/index.php?mode=page&id=4711 soll regExpFID.test(uri) false liefern, da "mode=page" enthalten ist.

Lautet die Adresse ab bspw. http://example.org/foo/index.php?mode=fobar&id=4711, sollte true zurückgegeben werden (sodass ich über regExpFID.exec(url) auch an die ID komme).

Das ermitteln der ID habe ich bisher so gelöst var regExpFID = new RegExp(/[?|&]id=([0-9]+)/);. Dieser Ausdruck schließt aber noch keine Adresse aus. Ist das, was ich vorhabe, in einem Ausdruck überhaupt möglich oder ist eine Lösung zB über indexof bereits gut? Sollte es mit einem reg. Ausdruck gehen, freue ich mich, wenn Ihr mir ein paar Tipps geben könntet.

Mit freundlichem Gruß
Micha

  1. id=([0-9]+)/);[/code]. Dieser Ausdruck schließt aber noch keine Adresse aus. Ist das, was ich vorhabe, in einem Ausdruck überhaupt möglich oder ist eine Lösung zB über indexof bereits gut?

    Ja, indexOf ist eigentlich schon in Ordnung.

    Sollte es mit einem reg. Ausdruck gehen

    Ginge auch mit einem, aber nicht so flexibel. Wenn man die Parameter umdrehen würde oder sonstige hinzufügen würde, könnte man einfache Ausdrücke an der Nase herumführen. Und wieso sich die Mühe geben, einen flexiblen, aber besonders komplexen Ausdrücke zu schreiben. Dann eher zwei recht zuverlässige:

    if (/[?&]mode=page(&|$)/.test(url)) {  
       var id = /[?&]id=([0-9]+)/.exec(url)[0];  
    }
    

    Mathias

    1. Hallo Mathias,

      vielen Dank für Deine Antwort!

      Ginge auch mit einem, aber nicht so flexibel. Wenn man die Parameter umdrehen würde ...

      Genau das hat mir auch sorge bereitet und *ich* habe keine Möglichkeit gesehen, wie ich das allg. formuliert bekomme.

      Mit freundlichem Gruß
      Micha

      1. Genau das hat mir auch sorge bereitet und *ich* habe keine Möglichkeit gesehen, wie ich das allg. formuliert bekomme.

        So z.B.

        var results = /(?:[?&]mode=page(?:&[^&]+)*&id=([0-9]+)|[?&]id=([0-9]+)(?:&[^&]+)*&mode=page)/.exec(url);  
        var id = results ? (results[1] || results[2]) : undefined;
        

        id ist jetzt entweder eine Zahl oder undefined.

        Aufgedröselt:

        Reihenfolge mode/page

        (?:
          [?&]mode=page  # mode-Parameter am Anfang des Query-Strings oder mittendrin
          (?:&[^&]+)*    # beliebe Anzahl von weiteren Parametern (davon ausgehend, dass & sie trennt)
          &id=([0-9]+)   # id-Parameter am Ende
        |

        Reihenfolge page/mode

        [?&]id=([0-9]+) # id-Parameter am Anfang des Query-Strings oder mittendrin
          (?:&[^&]+)*     # weitere Parameter (s.o.)
          &mode=page      # mode-Parameter am Ende
        )

        Das ?: am Anfang der Klammern führt dazu, dass diese Teiltreffer nicht im ergebnis-Array auftauchen.

        Leg mich nicht darauf fest, dass das zuverlässig funktioniert, siehe voriges Posting. Es ist möglich, aber nicht unbedingt besserer Code.

        Mathias