4

我们的 Web 应用程序允许用户指定他们自己的“slugs”,其中可以包括相对路径,例如 /somedir/some-file.htm。

在我们的路由配置中,我们需要确保仅支持有效的 slug(带段)。

我正在使用的正则表达式是:

(^[a-z0-9])([a-z0-9-/]+)([a-z0-9])$

这表示:

  • 一个有效的 slug 将匹配例如 some-file.htm
  • 带有段(相对路径)的有效 slug 将匹配例如 somedir/subdir/some-file.htm
  • 绝对 URL 将不匹配,例如 /somedir/some-file.htm
  • 尾随 / 或 - 将不匹配,例如 -slug-

不幸的是,这也意味着双斜杠将匹配例如 somedir//subdir//some-file.htm,因为我的表达式允许一个或多个斜杠。

如何更改它以允许段之间有零个或多个斜杠。

我以为:

(^[a-z0-9])(/?[a-z0-9-]+/?)([a-z0-9])$

会工作,但它不会。

4

4 回答 4

5

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$

编辑:如果您喜欢第一个正则表达式,请使用这个:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*$

它看起来凌乱而复杂,但根据您的规范似乎是正确的。

[a-z0-9]([a-z0-9-]*[a-z0-9])?

匹配单个名称。暂时忽略/s。

然后剩下的就是一个斜线,后面跟着同样的东西。

正如 Karoly 的回答中提到的,这不包括文字句点,例如“some-file.htm”与我写的正则表达式不匹配。

如果这是所需的行为,那么您实际上会想要:

^[a-z0-9]([a-z0-9-\.]*[a-z0-9])?(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)*$

最后,如果您只想在最后一节中允许文字句点,那么您将需要:

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

编辑:

一个想法是,这可以使用前瞻和后视来简化一点。

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

变成:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*(/(?!-\.)[a-z0-9-\.]+(?<!-\.))?$

于 2012-07-08T12:13:45.010 回答
1
(^[a-z0-9]+)(/[a-z0-9-]+)*([a-z0-9])$

注意:我.在您的正则表达式中看不到。

就我个人而言,我会分别测试第一个和最后一个字符,这使得正则表达式更简单、更有用。

于 2012-07-08T11:59:38.423 回答
0

检查有效路径(相对或绝对。点用于隐藏文件夹):
^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))

于 2015-06-23T08:01:35.737 回答
0

我的要求非常不同,所以我是在回答其他来这里寻找答案的人,而不是回答这里发布的确切问题和要求。

我的要求:

  • 它需要匹配同一字符串中的多个路径
  • 已知每条路径都以./../
  • 它不能使用look behinds,因为它们不受支持
  • 众所周知,每条路径都会在新的一行
  • 文件夹将始终使用单个/字符分隔。

这就是我想出的(基于 JS RegEx 语法):

我的解决方案

/\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

我将以此为例进行解释:

../path/to/file.ext lorem ipsum 文本

  • /..../g表示正则表达式将在同一字符串内多次匹配
  • \.\.?\/同时匹配.././

    /\.\.?\//g

    ../path/to/file.ext lorem ipsum 文本

  • [^\n"?:*<>|]+是不匹配字符的黑名单。
    • [^....]= 不匹配此字符列表。
    • \n= 新行(路径永远不会出现在同一行)
    • 所有其他字符都是文字。它们是非法的文件名字符。

      /\.\.?\/[^\n"?:*<>|]+/g

      ../path/to/file.ext lorem ipsum text

  • \.[A-z0-9]+是确保它在文件扩展名的末尾停止。

    /\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

    ../path/to/file.extlorem ipsum 文本

于 2018-09-25T11:01:05.577 回答