Forum: PC-Programmierung regex: mod_rewrite


von ggg (Gast)


Lesenswert?

Hallo,

ich bräuchte Hilfe bei einem regulären Ausdruck:


RewriteEngine on
RewriteBase /search
RewriteRule ^([^/]*)/([^/]*)[/]*([^/]*)[/]*$ 
/search/text.php?city=$1&street=$2&nr=$3 [L]

Es sollen URLs wie /search/a/b/c entsprechend umgeleitet werden.
Der obere Ausdruck funktioniert soweit, allerdings wird das erste "/" 
gefordert. Ich möchte aber, dass auch die URL /search/123 gültig ist. Im 
Moment kommt da ein Fehler, bei /search/123/ nicht.

Wenn ich den Ausdruck zu
RewriteRule ^([^/]*)[/]*([^/]*)[/]*([^/]*)[/]*$ 
/search/text.php?city=$1&street=$2&nr=$3 [L]
ändere bekomme ich grundsätzlich einen Scriptfehler.

Was mache ich falsch?

Danke!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ggg schrieb:
> Was mache ich falsch?
Naja es könnte schon helfen wenn du nicht wild irgendetwas kopierst. 
sonder versuchst es zu verstehen...
Auch hat es sich bewährt erstmal Teilausdrücke zu testen bevor man an 
solchen "Monstern" rumdokter.

> /search/123 gültig ist.
Dann soltest du das auch so schreiben oder dafür eine eigene Regel 
definieren.

> Moment kommt da ein Fehler, bei /search/123/ nicht.
WAS für ein Fehler?

Das Problem ist nämlich das dein Audruck 3 Capturing Groups erwartet, 
was soll den wohl passieren wenn es nur zwei sind?

Und das dein Audruck so ziemlich alles matcht ist auch nicht gerade 
förderlich.

Wenn ich mal davon ausgehe das citty eine Postleitzahl mit 5 Stellen ist 
könnte man zunächst so beginnen:
1
RewriteRule ^(0-9){5}/?$ /search/text.php?city=$1&street=&nr= [L]
 Das matcht auf alle URLs der form 12345 oder 12345/

Street sei jetzt einfach mal ein String aus Zeichen von a-z Länge 
beliebig aber > 1..
1
RewriteRule ^(0-9){5}/([a-z]+)/?$ /search/text.php?city=$1&street=$2&nr= [L]

Und nummer eine Zahl für die Hausnummer
1
RewriteRule ^(0-9){5}/([a-z]+)/([0-9]+)/?$ /search/text.php?city=$1&street=$2&nr=$3 [L]


Also insgesammt:
1
RewriteRule ^(0-9){5}/?$ /search/text.php?city=$1&street=&nr= [L]
2
RewriteRule ^(0-9){5}/([a-z]+)/?$ /search/text.php?city=$1&street=$2&nr= [L]
3
RewriteRule ^(0-9){5}/([a-z]+)/([0-9]+)/?$ /search/text.php?city=$1&street=$2&nr=$3 [L]

Alles ohne wilde Klammern und einen Sternenwald ([/]* heißt das am ende 
der URL beliebig viele / stehen dürfen, wieso sollte man das wollen?)

von ggg (Gast)


Lesenswert?

Danke, aber deine Lösung funktioniert nicht : kommt immer der 404er 
Fehler...

von ggg (Gast)


Lesenswert?

Alleine schon RewriteRule ^(0-9){5}/?$ 
/search/text.php?city=$1&street=&nr= [L]

matcht überhaupt nicht und gibt nur einen 404 aus ;)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Naja das war jetzt nur aus dem Gedächtnis hingeschrieben, außerdem 
gehört zu einem 404 auch noch eine URL...

^(0-9){5}/?$

macht nur auf URLS die exakt 5 Zahlen enthalten und entweder mit einem 
oder keinem / enden. Eventuell mußt du auch den Prefix search noch mit 
aufnhemen also etwa so:
1
^search/(0-9){5}/?$ /search/text.php?city=$1&street=&nr= [L]

von ... (Gast)


Lesenswert?

1
...(0-9){5}...

sollte das nicht eher
1
...([0-9]{5})...
heißen?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Jupp, wie gesagt alles auf die schnelle und ohne test geschrieben. Der 
TE scheint ja wohl die Lust verloren zu haben oder sein Problem 
anderweitig gelöst bekommen haben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.