我有一个控制器和操作,它采用客户名称,然后在数据库上进行搜索以匹配客户。有些客户可能有中间名,有些则没有。
为此,我有以下两条路线:
'full-name' => array(
'type' => 'regex',
'options' => array(
'regex' => '/(?<title>Mr|Miss|Mrs|Ms)/(?<firstname>[a-zA-Z0-9_-]+)/(?<middlename>[a-zA-Z0-9_-]+)/(?<lastname>[a-zA-Z0-9_-]+)',
'defaults' => array(
'controller' => 'Application\Controller\Customers',
'action' => 'index',
),
'spec' => '/%firstname%/%middlename%/%lastname%'
)
),
'name' => array(
'type' => 'regex',
'options' => array(
'regex' => '/(?<title>Mr|Miss|Mrs|Ms)(?<firstname>[a-zA-Z0-9_-]+)/(?<lastname>[a-zA-Z0-9_-]+)',
'defaults' => array(
'controller' => 'Application\Controller\Customers',
'action' => 'index',
),
'spec' => '/%firstname%/%lastname%'
)
),
我想知道是否有办法将它们组合成一个正则表达式规则,但我找不到任何适用于中间名的东西。我尝试了一些方法,例如:
(?<middlename>[a-zA-Z0-9_-]?)
(?<middlename>[a-zA-Z0-9_-]+|^$)
但后来它抱怨说,当我在没有中间名的情况下尝试它时没有匹配的路由。显然,我可以保持原样,因为它可以工作,但如果可以将两条路线组合成一条路线,那就太好了。
有谁知道这样做的方法?
编辑:与我实际需要的相比,我最初简化了代码,但这导致解决方案无法回答我关于正则表达式中可选值的问题。我更改了代码以反映我为什么不能有分段路线。
作为参考,这是我的初始代码:
'full-name' => array(
'type' => 'regex',
'options' => array(
'regex' => '/Customer/(?<firstname>[a-zA-Z0-9_-]+)/(?<middlename>[a-zA-Z0-9_-]+)/(?<lastname>[a-zA-Z0-9_-]+)',
'defaults' => array(
'controller' => 'Application\Controller\Customers',
'action' => 'index',
),
'spec' => '/%firstname%/%middlename%/%lastname%'
)
),
'name' => array(
'type' => 'regex',
'options' => array(
'regex' => '/Customer/(?<firstname>[a-zA-Z0-9_-]+)/(?<lastname>[a-zA-Z0-9_-]+)',
'defaults' => array(
'controller' => 'Application\Controller\Customers',
'action' => 'index',
),
'spec' => '/%firstname%/%lastname%'
)
),
谢谢!