如何只使用正则表达式允许一定数量的正斜杠?

时间:2013-08-24 01:12:54

标签: php regex

我正在路由我的应用程序,并且我希望在目录路径tags/之后只允许最多2个目录子路径。连字符和alnums是唯一允许的字符。

以下将全部验证,下面的粗体将作为单个匹配返回到路由器:

  • 标记/ 如何到烘烤
  • 标记/ 如何焙烤/饼干

如果有超过2个子路径(或者换句话说是2个或更多斜杠),路由器应该返回匹配。

我的服务器在尾部斜杠上重定向(到非尾部斜杠网址),因此不需要考虑它们。

我目前正在使用tags/([\w+\-\/]+)$,但这将允许无限多个子路径,并且在路由器返回匹配后我被迫检查子路径长度(正斜杠计数)。

我不确定如何在我写的字符集中只允许0或1个正斜杠,同时可能会跟随单词字符,然后将它们全部作为单个匹配返回。

这是否可以使用正则表达式?

4 个答案:

答案 0 :(得分:2)

Barmar的解决方案完美地回答了你的问题......这只是考虑路径表达式中斜尾的另一个版本:

(tags\/[-\w]+\/?(?:[-\w]+)?(?<!\/)\/?)$

regex101.com

答案 1 :(得分:1)

这个正则表达式应该这样做:

tags/[\w\-]+(/[\w\-]+)?$

它允许tags/之后的一个单词,后跟一个可选的斜杠和另一个单词。

你在字符类中不需要+ - 你说唯一允许的字符是alnums和连字符。

答案 2 :(得分:0)

完全按照您的说法进行操作,匹配“tags /”后跟“file”或“file / file”。粗略地说,“tags /(file | file / file)$”。

答案 3 :(得分:0)

易:

^tags(?:/[\w+\-]+){1,2}$

这是一个经过测试的PHP命令行脚本,它实现了正则表达式的注释版本:

<?php // test.php Rev:20130823_2100
$text = 'tags/how-to-bake/magic_brownies';

$re =   '% # Match path having two or three path segments.
        ^          # Anchor to start of string.
        tags       # Hard code first path segment.
        (?:        # Group 1 or 2 additional segments.
          /        # Path segments separated by /
          [\w+\-]+ # Path segment is one or more [A-Za-z0-9_-].
        ){1,2}     # End group of 1 or 2 additional segments.
        $          # Anchor to end of string.
        %ix';
if (preg_match($re, $text, $matches)) {
    echo("Successful match");
} else {
    echo("No match");
}
?>