Seite 1 von 1
Frage zu Regulären Ausdrücken
Verfasst: Dienstag 21. Dezember 2010, 09:10
von lynadge
Hallo Leute.
Ich probiere mich gerade an den Regulären Ausdrücken.
Mein Ziel ist es das der Routing Parser von bottle in einer URL ein einen doppelten slash auch als diesen erkennt. Da er ja bei dem vorkommen eines einzelnen Slashs eine neue Route anfängt.
Beispiel URL: "
http://localhosts:8080/set/http://abc.de"
Das Funktioniert in bottle auch super. Mir wurde schon gezeigt das ein "#.+#" alle Zeichen durchgehen lässt.
Meine Misere ist ist jetzt, das ich zwei routen definiert habe die sich bei dem "//" vom zweiten "http://" beißen.
Beispiel:
Code: Alles auswählen
@bottle.route('/set/:url#.+#')
@bottle.route('/set/:name/:url#.+#')
Nun war meine Idee, erst ein "[//]?" zu machen und danach alle folgenden Zeichen wieder mit ".+" durchgehen zu lassen.
Also in etwas so:
Code: Alles auswählen
@bottle.route('/set/:url#[//]?.+#')
@bottle.route('/set/:name/:url#.+#')
Leider Funktioniert diese Variante nicht.
Könnt Ihr mir folgen und Helfen?
Ihr müsst mir nicht die eventuelle Lösung nennen, ein schubs in die richtige Richtung reicht mir schon.
Lg, deadshox
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 21. Dezember 2010, 09:37
von sma
Warum nicht einfach nur "//"? Oder wenn es optional sein soll: "(?://)?". Das "[]" definiert eine Zeichenklasse bestehend aus zweimal dem selben Zeichen, das ist nicht, was du wollen kannst. Und wenn's eine HTTP-URL sein soll, kannst du's doch noch expliziter machen: ":url#https?://.+#".
Stefan
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 21. Dezember 2010, 14:16
von lynadge
Hallo, danke schon mal für die Antwort.
Ich muss dazu sagen, ich hab noch nie wirklich mit Regulären Ausdrücken gearbeitet. Deswegen meine Stolperversuche.
Leider Funktionieren deine Vorschläge nicht. Er fängt immer noch nach dem ":" an, abzuschneiden.
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 21. Dezember 2010, 14:25
von BlackJack
@deadshox: Sind bei Bottle innerhalb von `#...#` Doppelpunkte erlaubt? Kann vielleicht ein Problem mit Bottle sein, weil ein ':' ausserhalb eines Musters ja auch schon eine Bedeutung hat.
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 21. Dezember 2010, 15:36
von lynadge
@BJ, ich gehe jetzt einfach mal aus das alles was zwischen den "#...#" steht, als Regulärer Ausdruck geparst wird.
Re: Frage zu Regulären Ausdrücken
Verfasst: Samstag 25. Dezember 2010, 18:16
von lynadge
Hallo Leute. Ich bekomme es einfach nicht hin.
Aktuell sieht es so aus: "#(?://)?.+#" Das klappt auch soweit ganz gut. Wenn ich dann aber was ohne http:// eingebe trägt er es nicht so ein wie er es soll.
Frohes fest euch!
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 28. Dezember 2010, 11:10
von Defnull
Ich würde es so machen:
Code: Alles auswählen
@bottle.route('/set/:url#[^/]+://.+#')
@bottle.route('/set/:name/:url#.+#')
Die erste Route trifft, wenn der erste Slash nach dem /set/ ein Doppel-Slash ist. Die zweite trifft in allen anderen Fällen. So oder so ist der Doppel-Slash das einzige Unterscheidungs-Merkmal. Ohne "http://" wird es nicht klappen.
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 28. Dezember 2010, 14:41
von lynadge
Danke für die Antwort aber leider will es immer noch nicht. Er schneidet wenn die Route '/set/http://...' immer noch beim 'http:' ab und sieht es als 'name'.
Mir würde nur noch eins einfallen, finde es aber unsauber. Ich frage einfach 'name' ab und wenn es 'http:' ist dann verfahre ich damit wie wenn es ein '/set/http://...' gewesen wäre.
Danke für eure Hilfen.
Re: Frage zu Regulären Ausdrücken
Verfasst: Dienstag 28. Dezember 2010, 16:06
von Defnull
Ahh, ich weis jetzt wo das Problem ist (hab Grippe, bin nicht ganz klar im Kopf).
Der Router hört beim ersten Treffer auf zu suchen. Wenn du die 'name' Route also VOR der Anderen definierst, wird auch die name-Route zuerst treffen. Darum sollten Routen immer eindeutig sein. Probier mal das folgende:
Code: Alles auswählen
@bottle.route('/set/:url#[^/]+://.+#')
@bottle.route('/set/:name/:url#[^/].+#')
Nun trifft die erste route nur, wenn sie mit irgendwas und dann einem doppel-slash beginnt. Und die zweite trifft nur, wenn sie mir irgendwas und KEINEM doppel-Slash beginnt.
Viel mehr Sinn würde es aber machen, die URL als GET-Parameter zu übergeben. Schließlich handelt es sich bei der URL um Daten und nicht um eine Resource im Sinne einer URI. Dann hättest du auch das Problem mit den Slashs nicht mehr.
Re: Frage zu Regulären Ausdrücken
Verfasst: Montag 3. Januar 2011, 12:51
von lynadge
Danke dir. Hoffe deine Grippe ist mittlerweile wieder weg.
Ich habe dein Code noch mit einer pipe '|' erweitert und so hat es dann auch für mich Funktioniert.
Code: Alles auswählen
@bottle.route('/set/:url#[^/]+://|.+#')
@bottle.route('/set/:name/:url#[^/].+#')
Leider sieht bottle ja auch, ist ja auch richtig, ? als GET Parameter. Das behindert mein vorhaben wieder.
Mein Ziel war/ist es, URLs über die URL auf eine möglichst einfach Art und weise für den Benutzer zu übergeben. Leider ist das vorhaben doch komplexer als ich dachte. Werde dann wohl doch mit einem normalen Formular weiter machen müssen um alles realisieren zu können.
Trotzdem danke für die Hilfen. Hab ja einiges dazu gelernt.
