[apache] rewriterule werkt niet met '-'

Pagina: 1
Acties:

  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06-2025
Hi,

Ik gebruik momenteel volgende rewriterule:

code:
1
2
3
RewriteEngine on 
RewriteRule shop-(.*)-(.*)-(.*)\.html$ products.php?ID=$1&lang=$2
RewriteRule shop-(.*)-(.*)\.html$ products.php?ID=$1&lang=$2


De bedoeling is dus om deze url:
code:
1
2
shop-33-nl-stress-management-for-dummies.html en
shop-33-nl.html


om te vormen naar
code:
1
products.php?ID=33&lang=nl


de code is dus opgebouwd als shop-ID-language-EEN-STRING-VOOR-GOOGLE.html. Er is echter een probleempje met mijn rule. De ID wordt juist genomen, maar $lang niet.

Iemand enig idee waar het bugje zit?

Edit: vergeten te vermelden: $lang zal in dit geval 'for' opleveren ipv 'nl', er is dus een probleempje met mijn syntax

[ Voor 9% gewijzigd door webinn op 26-08-2008 16:52 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:57

TeeDee

CQB 241

Misschien is de dash (-) een speciaal karakter?
Misschien wordt er wel iets teveel gematched?

[ Voor 33% gewijzigd door TeeDee op 26-08-2008 16:54 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06-2025
TeeDee schreef op dinsdag 26 augustus 2008 @ 16:51:
Misschien is de dash (-) een speciaal karakter?
dat weet ik dus niet. Iemand die dat kan bevestigen? Ik kan natuurlijk mijn string scheiden met een ander teken, maar dat doe ik liever niet. Ik zou ook
code:
1
shop/33/nl/stress-management-for-dummies.html

kunnen nemen, maar dat liever ook niet, tenzij het niet anders kan :)
TeeDee schreef op dinsdag 26 augustus 2008 @ 16:51:
Misschien wordt er wel iets teveel gematched?
Dit is inderdaad het probleem

[ Voor 17% gewijzigd door webinn op 26-08-2008 16:54 ]


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Kan je je regexp niet specifieker maken , ipv met .* te werken?

code:
1
2
RewriteRule shop-([0-9]+)-([a-zA-Z]{2})-(.*)\.html$ products.php?ID=$1&lang=$2
RewriteRule shop-([0-9]+)-([a-zA-Z]{2})\.html$ products.php?ID=$1&lang=$2


Ik denk niet dat de syntax helemaal deugt maar ik hoop de je begrijpt welke richting ik op wil.

Skill is when luck becomes a habit.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:57

TeeDee

CQB 241

webinn schreef op dinsdag 26 augustus 2008 @ 16:54:
[...]
Iemand die dat kan bevestigen?
En als je dat nu zelf eens opzoekt?

Kijk eens naar de variable $lang. Dat is nu for ipv nl. Lijkt mij dat je daar weer een patroon in kan ontdekken. (iets met alles tussen de streepjes). Laat RegExp nu basaal patroonherkenning zijn.

mijn kennis van apache rewriting is nihil, maar dat de dash reserver is, kon ik gewoon vinden via Google.

[ Voor 13% gewijzigd door TeeDee op 26-08-2008 17:08 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06-2025
eek schreef op dinsdag 26 augustus 2008 @ 17:04:
Kan je je regexp niet specifieker maken , ipv met .* te werken?

code:
1
2
RewriteRule shop-([0-9]+)-([a-zA-Z]{2})-(.*)\.html$ products.php?ID=$1&lang=$2
RewriteRule shop-([0-9]+)-([a-zA-Z]{2})\.html$ products.php?ID=$1&lang=$2


Ik denk niet dat de syntax helemaal deugt maar ik hoop de je begrijpt welke richting ik op wil.
schitterend! dit is exact wat ik nodig had, thanks

Het resultaat is inderdaad
code:
1
2
3
RewriteEngine on 
RewriteRule shop-([0-9]+)-([a-z]{2})-(.*)\.html$ products.php?ID=$1&lang=$2
RewriteRule shop-([0-9]+)-([a-z]{2})\.html$ products.php?ID=$1&lang=$2

[ Voor 17% gewijzigd door webinn op 26-08-2008 17:08 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Dit heeft te maken met het "greedy" zijn van de "*" matcher.
Concreet betekent dit dat in
code:
1
RewriteRule shop-(.*)-(.*)-(.*)\.html$ products.php?ID=$1&lang=$2

de eerste (.*) alle tekens pakt voor de laatste twee dashes (dat is dus "shop-33-nl-stress-management"). PHP maakt van de ID automatisch 33 als je deze naar een integer converteert omdat de string met een getal begint (bwegh).

De greediness kun je regelen met de "?" operator. Het gewenste resultaat had je dus ook bereikt met
code:
1
RewriteRule shop-(.*?)-(.*?)-(.*)\.html$ products.php?ID=$1&lang=$2

Zonder "?" betekent: pak zoveel tekens als mogelijk (en aangezien "-" ook matched met ".*" pakt hij dus ook teveel).
Met "?" betekent: pak zo min mogelijk tekens om toch aan de gehele regex te voldoen. Dit betekent dat ".*" ophoudt met matchen zodra de eerste daaropvolgende dash ("-") gevonden wordt.

Zie ook http://www.regular-expressions.info/repeat.html

Uiteraard is het altijd het beste om je matches zo gedetailleerd mogelijk te omschrijven. Dus als je weet dat er twee karakters staan is "[a-zA-Z]{2}" altijd beter dan ".*".

[ Voor 47% gewijzigd door B-Man op 26-08-2008 17:27 ]


  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06-2025
B-Man schreef op dinsdag 26 augustus 2008 @ 17:22:
Dit heeft te maken met het "greedy" zijn van de "*" matcher.
....
thanks voor die uitleg! Mijn kennis van dergelijke matching is vrij laag, maar zo leer ik weer bij _/-\o_

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1