匹配某些路径模式并排除其他正斜杠

时间:2018-01-10 09:05:40

标签: php regex

我是Regex的新手。 我想匹配Google Analytics的某个网址页面模式。

问题:

模式如下:

/(de|en|fr|it)/../any-word-including-dashes/word-or-words-including-dashes-and-numbers

我想只匹配此模式,并将所有pagePathes排除在另一个正斜杠之外或与初始模式不匹配:

包括:

/de/ab/word-word/word1-and-something-else
/de/ab/word-word/word1-and-something-else?any_ting1=any.-thing2

排除:

/de/ab/word-word/word1-and-something-else/
/de/ab/word-word/word1-and-something-else/anything
/de/ab/word-word
/fr/moreThanTwoCHAR/anything

我的正则表达式:

搜索完SO(Exclude forward slash before end"Match anything but"Finding exactly n occurences of "/"disallow 0 or more occurences of a CHAR)后,我想出了以下正则表达式:

^(\/de|\/fr|\/en|\/it)\/..\/.+\/\w+[^\/]*

它正确地做了什么

它正确地排除了以下路径:

/fr/moreThanTwoCHAR/anything

失败的原因

上述正则表达式的问题在于它也匹配(在regex101上测试):

/de/ab/word-word/word1-and-something-else/anything

我似乎无法理解为什么它与字符串匹配额外的正斜杠,即使我说要排除0或更多其他出现(至少从我的理解)。任何人都可以解释我错在哪里?

1 个答案:

答案 0 :(得分:1)

请注意,.匹配任何字符(如果未使用DOTALL选项(/s),则换行符除外),因此您的正则表达式只匹配您需要的更多输入类型。

您可以使用

'~^/(de|fr|en|it)/[^/]{2}(?:/[^/]+){2}$~'

请参阅regex demo

模式详情

  • ^ - 输入开始
  • / - /字符
  • (de|fr|en|it) - 三个备选子字符串之一:defrenit
  • /[^/]{2} - /,然后是/以外的任何2个字符
  • (?:/[^/]+){2} - 除了/
  • 之外的/和1个以上字符的2个连续序列
  • $ - 输入结束。