PCRE 使参数可选

PCRE make parameters optional

我要配:

我有这个正则表达式:/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 设为可选? 我想稍后检查一下,并在缺少其中一个参数时向客户显示一个很好的错误。

感谢您的帮助!

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

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

RegEx Demo

代码:

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

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

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

然后解析生成的组。如果有,那就把它当作一个国家。如果有两个,则将第二个视为城市。如果有 none,则显示错误信息。

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

/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

我猜这对于您的特定用例可能没有意义(假设您似乎正在根据 country/city 解析状态)但我通常是把自己画到角落里。