【问题标题】:PCRE make parameters optionalPCRE 使参数可选
【发布时间】:2015-01-28 21:17:49
【问题描述】:

我想匹配:

  • /city-and-country-to-state/
  • /city-and-country-to-state/荷兰
  • /city-and-country-to-state/nederland/amsterdam
  • /city-and-country-to-state/Germany/übercity

我有这个正则表达式:/city-and-country-to-state/(?<country>[\p{L}\s]+)/(?<city>[\p{L}\s]+)$)u

preg_match 的输出(正则表达式,/city-and-country-to-state/nederland/amsterdam):

Array
(
    [0] => /city-and-country-to-state/nederland/amsterdam
    [country] => nederland
    [1] => nederland
    [city] => amsterdam
    [2] => amsterdam
)

如何将 /country 和 /city 都设为可选? 我想稍后检查并在其中一个参数丢失时向客户显示一个很好的错误。

感谢您的帮助!

【问题讨论】:

    标签: regex preg-match pcre


    【解决方案1】:

    您可以将此正则表达式与可选组件一起使用:

    ^/city-and-country-to-state(?:/(?<country>[^/\n]+)(?:/(?<city>[^/\n]+))?)?/?$
    

    RegEx Demo

    代码:

    preg_match_all(
       '~^/city-and-country-to-state(?:/(?<country>[^/]+)(?:/(?<city>[^/]+))?)?/?$~um',
       $input, $matches
    );
    

    【讨论】:

      【解决方案2】:

      我可能会使用更通用的东西,比如

      /city-and-country-to-state(/[\p{L}\s]+)*
      

      然后解析结果组。如果有,则将其视为国家。如果有两个,则将第二个视为城市。如果没有,则显示错误消息。

      这也更具可扩展性,因为您可以降低到更精细的特异性,而无需重新发明您的正则表达式。例如,如果你要为美国做这样的事情,那么你可以使用

      /city-and-country-to-state/US/Atlanta
      

      或者,指定一个较小的城市,

      /city-and-country-to-state/US/California/Atlanta
      /city-and-country-to-state/US/Idaho/Atlanta
      /city-and-country-to-state/US/Texas/Atlanta
      

      我猜这对于您的特定用例可能没有意义(鉴于您似乎正在根据国家/城市解决状态),但我通常是 not 的粉丝 把自己画到角落里。

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        相关资源
        最近更新 更多