PCRE使参数可选

时间:2015-01-28 21:17:49

标签: regex preg-match pcre

我想匹配:

  • /城市和国家到状态/
  • /城市和国家到状态/荷兰
  • /城市和国家到状态/荷兰/阿姆斯特丹
  • /城市和国家到状态/德国/ü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? 我想稍后检查一下,并在缺少其中一个参数时向客户显示一个很好的错误。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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
);

答案 1 :(得分:1)

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

/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

我猜这可能对你的特定用例没有意义(考虑到你似乎是根据国家/城市来解决国家),但我通常是的粉丝不将自己画成一个角落。