1

我正在路由我的应用程序,并且我只想在tags/. 连字符和alnums 是唯一允许的字符。

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

  • 标签/如何烘烤
  • 标签/如何烘烤/饼干

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

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

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

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

这可以用正则表达式吗?

4

4 回答 4

2

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

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

正则表达式101.com

于 2013-08-24T01:34:37.457 回答
1

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

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

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

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

于 2013-08-24T01:23:26.550 回答
0

照你说的做,匹配“tags/”,后跟“file”或“file/file”。粗略地说,“标签/(文件|文件/文件)$”。

于 2013-08-24T01:25:16.260 回答
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");
}
?>
于 2013-08-24T03:16:33.483 回答