2014-06-25 7 views
0

Je veux attraper si l'URL est une page de blog ou non. Une page de blog peut être:Chaîne optionnelle dans RegExp

  • /blog
  • /blog/page/1
  • /blog/page/143

Ainsi, page/pageNumber est facultative. Comment puis-je créer une expression régulière qui en cours de test renvoie true si l'URL est une page de blog?

J'ai créé le regex pour urls contenant la chaîne /page/ et il semble fonctionner très bien:

/\/blog\/page\/[1-9]([0-9]*)/ 

Exemple:

> /\/blog\/page\/[1-9]([0-9]*)/.test("/blog/page/1") 
true 
> /\/blog\/page\/[1-9]([0-9]*)/.test("/blog/page/0") 
false 
> /\/blog\/page\/[1-9]([0-9]*)/.test("/blog/page/30") 
true 

Mais comment puis-je mettre en /page/number être facultative?

J'ai essayé:

/\/blog(\/page\/[1-9]([0-9]*))?/ 

Ce retourne true pour urls incorrectes:

> /\/blog(\/page\/[1-9]([0-9]*))?/.test("/blog/p") 
true 
+0

ce qui ne va pas avec/^ \/blog/i si vous êtes en utilisant test()? – dandavis

+0

@dandavis '/ blog/1-my-interesting-post' n'est pas la même chose avec'/blog/page/1'. –

Répondre

1

Vous devez ajouter un marqueur de fin ($) afin qu'il arrête de vérifier.

> /\/blog(\/page\/[1-9]([0-9]*))?$/.test("/blog/p") 
false 
> /\/blog(\/page\/[1-9]([0-9]*))?$/.test("/blog/page/1") 
true 
> /\/blog(\/page\/[1-9]([0-9]*))?$/.test("/blog/page/0") 
false 
> /\/blog(\/page\/[1-9]([0-9]*))?$/.test("/blog/page/30") 
true 
> /\/blog(\/page\/[1-9]([0-9]*))?$/.test("/blog") 
true 
1

Vous voulez ajouter des marqueurs pour le début (^) et à la fin ($) de la chaîne. Dans sa forme actuelle, votre vérification retournera également vrai si elle ne correspond qu'à une partie de la chaîne.

/^\/blog(\/page\/[1-9]([0-9]*))?$/ 

Consultez cette fiddle.

1

Vous pouvez utiliser cette regex pour faire /page/num en option:

/^\/blog(\/page\/\d+)?\/?$/ 
+0

Oui, ce ne sera pas et ce n'est pas dans les exigences non plus. – anubhava

+2

Il apparaîtra toujours '/ blog/p' et'/blog/page'. Puisque la méthode Javascript 'test()' est satisfaite avec une correspondance partielle. –

+0

Oui vrai, ont ajouté des ancres maintenant pour éviter cette situation. – anubhava

0

Vous pouvez utiliser des groupes non capture pour cela,

^\/blog(?:\/page(?:\/[1-9]\d*)?)?$ 
+2

Pourquoi capturer de la matière en utilisant /./. Test()? – dandavis

+0

@dandavis ne capturera rien. –

+0

@AvinashRaj Cela va attraper '/ blog/page/0' qui est incorrect. –