2010-03-25 4 views
1

Im vraiment vraiment un débutant en regexp et je ne peux pas comprendre comment faire cela.Apache RewriteRule: est-il possible de 'détecter' le premier et le second segment de chemin?

Mon but est d'avoir le RewriteRule de « tranche » le chemin d'URL de la requête en 3 parties:

example.com/foo 
#should return: index.php?a=foo&b=&c= 

example.com/foo/bar 
#should return: index.php?a=foo&b=bar&c= 

example.com/foo/bar/baz 
#should return: index.php?a=foo&b=bar&c=baz 

example.com/foo/bar/baz/bee 
#should return: index.php?a=foo&b=bar&c=baz/bee 

example.com/foo/bar/baz/bee/apple 
#should return: index.php?a=foo&b=bar&c=baz/bee/apple 

example.com/foo/bar/baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters 
#should return: index.php?a=foo&b=bar&c=baz/bee/apple/and/whatever/else/no/limit/in/those/extra/parameters 

En bref, le premier segment dans le chemin d'URL (foo) doit être donné à un , le deuxième segment (bar) à b, et le reste de la chaîne dans c

I wroted celui-ci

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 
    RewriteRule ^(([a-z0-9/]))?(([a-z0-9/]+))?(([a-z0-9]+))(.*)$ index.php?a=$1&b=$2&c=$3 [L,QSA] 
</IfModule> 

Mais évidemment ne fonctionne pas, et je ne sais même pas si ce que je veux est possible.

Une suggestion?

EDIT: Après avoir joué avec le directeur de l'entraîneur, je suis celui travaillant aussi:

RewriteRule ^([^/]*)?/?([^/]*)?/?(.*)?$ index.php?a=$1&b=$2&c=$3 [L,QSA] 

Répondre

1

Je probablement utiliser cette règle (semblable à la vôtre):

RewriteRule ^([^/]+)?/?([^/]+)?/?(.*) index.php?a=$1&b=$2&c=$3 [L,QSA] 

Et si vous ne voulez pas que des barres obliques de fin, vous pouvez utiliser cette règle pour les supprimer:

RewriteRule (.*)/$ /$1 [L,R=301] 
0

Qu'en est-ce:

RewriteRule ^/([a-z0-9]+?)(?:/([a-z0-9]+?)){0,1}(?:/(.*)){0,1}$ [L,QSA] 

j'ai remarqué les problèmes suivants avec votre regex:

  • Dans votre premier groupe, vous étiez seulement à la recherche du premier caractère - le signe + après les états du groupe de caractères pour correspondre au groupe avec n'importe quel nombre de caractères tant qu'il y en a au moins un.

  • Vous avez seulement besoin d'un ensemble de supports pour correspondre à la sous-expression

  • Le? opérateur (est-ce pour faire le match paresseux?) continuer tout droit après que l'opérateur de répétition (de +)

  • Je pense aussi que l'URI demande commence par /, qui était absent de votre regex

  • Votre syntaxe les groupes 2 et 3 en option n'a pas été tout à fait correct (?:stuff here){0,1} signifie que « des choses ici » peut apparaître ou non

J'ai testé dans un grand programme appelé The Regex Coach qui donne les éléments suivants

/foo (or /foo/) = index.php?a=foo&b=&c= 
/foo/bar (or /foo/bar/) = index.php?a=foo&b=bar&c= 
/foo/bar/any/number/of/other/parameters/after/the/third/one = index.php?a=foo&b=bar&c=any/number/of/other/parameters/after/the/third/one 
+0

pourquoi la downvote? Si ma solution est incorrecte, veuillez avoir la courtoisie de me dire pourquoi. Il semble faire le travail, comme je l'ai expliqué dans ma réponse, alors j'apprécierais la suppression du downvote. –

+0

Ne sait pas qui vous a downvoted, mais la première version que vous avez posté fonctionne, sauf que le deuxième paramètre (barre) est obligatoire .. serait génial si seulement le premier serait obligatoire. Au lieu de cela la version de las que vous avez posté, avec le/juste après le ^, ne fonctionne pas! – Strae

+0

Ceci est la version qui fonctionne (selon l'entraîneur de regex) - seul le premier paramètre est obligatoire (au moins un caractère après le début /.) Je pensais qu'Apache commençait l'URI avec un /? Sinon, supprimez simplement la première barre oblique de l'expression rationnelle. –

Questions connexes