Zeichekette suchen und andere dabei ausschließen
Micha
- javascript
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
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
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
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:
(?:
[?&]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
|
[?&]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