2009-09-08 10 views
0

Disons que j'ai ceci àproblème regex nouveau

URL
site.com/hello-world/test.html 
site.com/hello-world/test/test.html 

si je vais à la première url j'ai ce regex

^.*/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 

mais url 2 est également url vaild avec le regex ? comment dire à la regex que la première url est l'url qui devrait être vaild et non la seconde?

+1

Pour répondre à cette question, vous devez nous dire pourquoi la première URL est valide et non la seconde. –

+2

Il existe des solutions infinies, quelle est la logique regex que vous voulez construire? –

+0

Yup - solution triviale serait la regex '^ site \ .com/hello-world/test \ .html $'. Il correspond à la première mais pas à la deuxième URL. – MSalters

Répondre

3

Bien sûr, la deuxième chaîne, il est également valable contre votre regex:

 
sub-expression  result 
----------------------------------------------------------------------- 
^.*     matches: "site.com/hello-world/test/test.html" 
/     backtrack: "site.com/hello-world/test/" 
([a-z0-9,-]+)   matches: "site.com/hello-world/test/test" 
/     backtrack: "site.com/hello-world/test/" 
([a-z0-9,-]+).html$ matches: "site.com/hello-world/test/test.html" 

mieux:

 
sub-expression  result 
----------------------------------------------------------------------- 
^[^/]+    matches: "site.com" 
/     matches: "site.com/" 
([a-z0-9,-]+)   matches: "site.com/hello-world" 
/     matches: "site.com/hello-world/" 
([a-z0-9,-]+)\.html$ fails (which is the expected result) 

vous devez donc utiliser:

 
^[^/]+/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$ 
+0

^[^ /] ./ ([a-z0-9, -] +)/([a-z0-9, -] +). Html $ échoue? –

+0

C'est ce que vous semblez vouloir - la deuxième chaîne ne devrait pas correspondre, en termes de regex, c'est-à-dire que "l'expression régulière échoue pour cette chaîne". – Tomalak

+0

oui, la deuxième URL devrait échouer pas le premier. –

0

Je pense que le problème est l'utilisation du mot-clé glouton *. Au début de votre expression.

Cheat un peu.

^.*(com|org|edu|net|gov)/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 
0

* correspond à "site.com/hello-world" dans le second cas. Vous devez être plus spécifique pour la partie domaine.

0

Dans le second cas,. * Correspond plus que prévu.

peut-être remplacer avec le quantificateur non gourmand.

^.*?/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 
1

Pour la première URL de la * partie du motif correspond à « site.com », mais pour la seconde URL elle correspond à « site.com /Bonjour le monde".

Si vous ne souhaitez pas autoriser plus d'un dossier, vous pouvez interdire des barres obliques dans la partie du motif qui correspond au nom de domaine:

^[^/]*/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$ 

(Notez que je mets une barre oblique inverse avant la . période avant l'extension html une période correspond à un caractère, alors que \. matchs seulement une période)

Edit:.
Si vous souhaitez autoriser les URL et utiliser « bonjour monde/test » comme dossier pour le second , autorisez des barres obliques dans la partie dossier:

^[^/]*/([a-z0-9,-/]+)/([a-z0-9,-]+)\.html$ 

Si vous voulez utiliser « bonjour-monde » comme dossier et « test/test » comme la page, laissez slash dans le nom du fichier partie:

^[^/]*/([a-z0-9,-]+)/([a-z0-9,-/]+)\.html$ 
+0

Je veux autoriser site.com/hello-world/test.html et site.com/hello-world/test/test.html mais les pages sont différentes. –

+0

@Frozzare: Vous avez spécifiquement demandé que la deuxième URL ne soit pas valide ... J'ai ajouté quelques alternatives dans la réponse. – Guffa

+0

Oui, car la première url ne devrait fonctionner que –

0

Pas une solution, juste une suggestion: il y a beaucoup d'excellents outils qui vous permettent d'expérimenter avec des expressions régulières et vous aident réellement à les écrire. J'aime particulièrement Expresso; apparemment aussi The Regulator est un très bon.