nginx正则表达式:检测是否存在分隔符

时间:2014-03-04 18:48:07

标签: regex bash nginx

我有一个类似以下任何字符串的字符串:

1) /tag/example/123
2) /tag/example/123/
3) /tag/example/123/1v1
4) /tag/example/123/1v1/yes/no/maybe

我在nginx上对这个字符串进行了重写,如下所示:

rewrite ^/tag/example/(\d*)/(.*) /example/$1/$2;

对于字符串1,$ uri最终看起来像/ example / 123。 / example / 123 / 1v1 for string 3)。等等...

通过这次重写,我需要$ 1为123和$ 2作为字符串的其余部分。如果在123之后没有任何内容(字符串1),我需要$ 2才能为空。此正则表达式适用于2),3)和4),但不适用于1)。 1)使重写中止,因为在123之后不存在/。

输出:

1) Aborts
2) $1 = 123, $2 = NULL
3) $1 = 123, $2 = 1v1
4) $1 = 123, $2 = 1v1/yes/no/maybe

我怎样才能让它适用于所有字符串?

3 个答案:

答案 0 :(得分:0)

我不确定这是否转换为nginx,但对于Perl正则表达式,您需要使用非捕获括号,如下所示:

s^(?:/tag)?(?:/example)((((/\d*)(/)?)(1v1)?)(/yes/no/maybe)?)^example/$1$2$3$4^g 

我担心我用'^'来代替/保持答案直截了当 - 我不知道是否可以在nginx中使用该替换,但我认为正则表达式很好。

答案 1 :(得分:0)

你这样做了吗?

rewrite ^/tag/example/(\d*)/?(.*) /example/$1/$2;

答案 2 :(得分:0)

我认为你解决了你的问题,但是在不太可能的情况下,其他人无法看到如何修改代码以允许斜杠之间的任何字母数字字符组合,我认为这应该是好的:

s^(?:/tag)?(?:/example)((((/\d*)(/)?)(\w+?)?)(/w+?/w+?/w+?)?)^example/$1$2$3$4^g