regex - 相对路径正则表达式

标签 regex

我们的 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])$
    

    会起作用,但不会。

    最佳答案

    ^[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])?
    匹配单个名称。忽略 /暂时。

    然后剩下的就是一个斜杠,然后是同样的东西。

    正如 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-\.]+(?<!-\.))?$

    关于regex - 相对路径正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382919/

    相关文章:

    regex - 通过正则表达式替换匹配中的单个字符

    regex - Delphi中的RegEx剥离回车符和换行符

    java - 这个正则表达式不正确吗?找不到匹配项

    c# - 查找字符串中的所有子字符串c#(正则表达式,字符数组?)

    PHP - 仅在来自文本的链接中将空格转换为 %20

    用于清理字符串值的 Javascript 正则表达式

    Javascript 正则表达式将给定字符串中的 'n' 相同连续字符减少为单个字符

    php - 正则表达式仅匹配不以引号开头的字符串

    php - 自由的货币正则表达式

    php - 日期验证的正则表达式帮助 - dd/mm/yyyy - PHP