【问题标题】:regex match URL path only with specific chars?正则表达式仅与特定字符匹配 URL 路径?
【发布时间】:2020-04-20 02:40:24
【问题描述】:

我在 PHP 中搜索一个正则表达式来匹配一个带有特定字符的简单 URL 路径,而不是更多。

我的正则表达式不能正常工作(标记 'gm' 仅用于测试。在工作过程中请不要更准确地使用 'g'。):

/^\/[A-Za-z0-9-]+\/?[A-Za-z0-9-]+\/?[A-Za-z0-9-]+\/?[A-Za-z0-9-]+\/?$/gm

带有注释的 URL 路径示例:

#match: YES
/
/trip-001
/trip-001/
/trip-001/summer-2019
/trip-001/summer-2019/
/trip-001/summer-2019/ibiza-001/
/trip-001/summer-2019/ibiza-001/PICT-001

#match: NO
//
trip-001
trip-001/
trip-001/summer-2019
trip-001/summer-2019/
trip-001/summer-2019/ibiza-001/
trip-001/summer-2019/ibiza-001/PICT-001

//trip-001
trip-001//
//trip-001/summer-2019
//trip-001//summer-2019
trip-001//summer-2019
//trip-001/summer-2019/
//trip-001//summer-2019//
trip-001//summer-2019/
trip-001/summer-2019//
trip-001/summer-2019/
trip-001/summer-2019/ibiza-001/
//trip-001/summer-2019/ibiza-001/
//trip-001//summer-2019/ibiza-001/
//trip-001/summer-2019//ibiza-001/
//trip-001/summer-2019/ibiza-001//
trip-001/summer-2019/ibiza-001//
trip-001/summer-2019/ibiza-001/
trip-001/summer-2019/ibiza-001/PICT-001
//trip-001/summer-2019/ibiza-001/PICT-001
# and similar

/trip-001/summer-2019/ibiza-001/PICT-001/
/trip-001/summer-2019/ibiza-001/whatever-987/PICT001
/trip-001/summer-2019/ibiza-001/whatever-987/PICT001/

trip-001/summer-2019/ibiza-001/PICT-001/
trip-001/summer-2019/ibiza-001/whatever-987/PICT001
trip-001/summer-2019/ibiza-001/whatever-987/PICT001/

我不知道它适用于{n}

只有这个字符集:A-Za-z0-9-/,仅此而已。数字请不要\d

它用于 PHP 中的 !preg_match()。

编辑:前导斜线是必须的。双斜线和更多是不允许的。尾部斜线是或否。

【问题讨论】:

    标签: regex


    【解决方案1】:

    看来,只有在不超过 5 个斜杠的情况下,该 URL 才有效。

    你可以调整你的模式

    ^(?!(?:[^\/]*\/){5})(?:(?:\/[A-Za-z0-9-]+){1,4}\/?|\/)$
    

    regex demo

    详情

    • ^ - 字符串开头
    • (?!(?:[^\/]*\/){5}) - 如果字符串中出现 5 次 / 字符,则匹配失败
    • (?: - 非捕获组的开始:
      • (?:\/[A-Za-z0-9-]+){1,4}\/? - 出现 1 到 4 次 / 和 1+ ASCII 字母数字或 - 字符,然后是可选的 / 字符
      • | - 或
      • \/ - 字符串中的单个 / 字符
    • ) - 非捕获组结束
    • $ - 字符串结束。

    【讨论】:

    • @Malama 正确。这也是我的建议。见updated samples demo
    • @Malama (?:[^\/]*\/){5} 匹配除 / 之外的任何 0+ 字符的 5 次出现,后跟 /。它是负前瞻中的一种模式,它只会使任何包含 5 个或更多 / 字符的字符串失败。您不需要用任何模式替换它,消费 模式将验证字符串。 (?:...)non-capturing group
    • @Malama 我的两个正则表达式都需要 / 作为第一个字符。见your updated sample demo。如果您需要更多说明,请在此处询问,添加更多 cmets。
    • @Malama 是否允许空字符串?
    • @Malama 我修复了答案中的模式。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2020-08-19
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多