我正在路由我的应用程序,并且我希望在目录路径tags/
之后只允许最多2个目录子路径。连字符和alnums是唯一允许的字符。
以下将全部验证,下面的粗体将作为单个匹配返回到路由器:
如果有超过2个子路径(或者换句话说是2个或更多斜杠),路由器应该返回否匹配。
我的服务器在尾部斜杠上重定向(到非尾部斜杠网址),因此不需要考虑它们。
我目前正在使用tags/([\w+\-\/]+)$
,但这将允许无限多个子路径,并且在路由器返回匹配后我被迫检查子路径长度(正斜杠计数)。
我不确定如何在我写的字符集中只允许0或1个正斜杠,同时可能会跟随单词字符,然后将它们全部作为单个匹配返回。
这是否可以使用正则表达式?
答案 0 :(得分:2)
Barmar的解决方案完美地回答了你的问题......这只是考虑路径表达式中斜尾的另一个版本:
(tags\/[-\w]+\/?(?:[-\w]+)?(?<!\/)\/?)$
答案 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");
}
?>