【问题标题】:regex to match subpattern structure正则表达式匹配子模式结构
【发布时间】:2023-04-04 00:59:01
【问题描述】:

我正在测试一些正则表达式来处理子模式,这样我就可以通过 PHP 为每个 uri 段应用定义的规则。其中一些部分是可选的,所以我尝试了这个:

preg_match('#^/(?P<controller>[\w-]+)(?:/(?P<[\w-]+)(?:/(?P<id>[\d]+)))/?$#uD', '/blog/post', $matches);

这个正则表达式匹配/blog/post/1,但不匹配blog/post,因为第二个和第三个参数都是可选的。有什么线索吗?

【问题讨论】:

  • 您确定第二组和第三组是可选的吗?我看到你正在使用look-aehead (?:),但要使它们成为可选需要()?
  • @FrankvanPuffelen ?: 不是前瞻组,而是非捕获组。
  • @m.buettner:谢谢。我总是混淆各种构造名称。 ;-) 不过,它们都不是可选组 (()?),所以我说对了。
  • @AndyLester 这不是 XML
  • @AndyLester URI XML 怎么样?

标签: php regex pcre


【解决方案1】:

为什么第二部分和第三部分是可选的?没有? 使它们成为可选的。您拥有的 ? 仅适用于最后一个斜杠。此外,如果存在第二组,您需要确保第三组仍然是可选的。也许你正在寻找这样的东西:

'#^/(?P<controller>[\w-]+)(?:/(?P<item>[\w-]+)(?:/(?P<id>[\d]+))?)?/?$#uD'

请注意,在您的问题中,第二个捕获组无效,因为您有一个开放的 &lt; 而不是要遵循的组名。我改变了它,因为我认为这可能是问题中的错字。

不过,如果您采用与正则表达式不同的方法,它可能会大大提高代码的可读性。 exploding / 怎么样。然后$result[1] 将成为您的控制器。然后你可以检查是否有$result[2] 并检查它是否是一个有效的“项目”(或任何你称之为的)。然后您可以检查是否有$result[3],如果那是一个数字并将其用作您的id。这种方法很容易扩展到多个参数,并检查不同的允许项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多