Zend Route Regex - 匹配路由与可选参数AND加号

时间:2014-11-06 08:13:57

标签: regex zend-framework routing

THIS问题之后,我设法创建了与Zend_Controller_Route_Regex一起使用的正则表达式,它不仅匹配必需参数,还匹配可选参数。

拥有以下链接:

fooroute,alles,p0000,1
fooroute,alles,p0000
fooroute,alles
fooroute

从:

开始
fooroute,([\+\sa-zA-Z]+),([p0-9]+),(\d+)

我最终关注了正则表达式:

fooroute(?:\,|$)([\+a-zA-Z]+|$)(?:\,|$)([p0-9]+|$)(?:\,|$)([0-9]+|$)

上面列出的链接工作正常。

问题是第一个参数中的\+似乎没有正常工作。 试图按照以下路线:

fooroute,This+Is+Test,p0000,1

我最终得到Page not found例外。

我使用regexr.com构建了我的模式,我的工作结果可以找到HERE

我缺少什么?

更新 代码:

$router->addRoute(
            'www-search-results',            
            new Zend_Controller_Router_Route_Regex(
                    'fooroute(?:(?:,([a-z_]+))?(?:,(p\d+))?(?:,(\d+))?)?$',
                    array(
                        'module'=>'www',
                        'controller'=>'index', 
                        'action'=>'searchresults', 
                        'city' => 'alles',
                        'searchParams' => 'p0000',
                        'page' => 1

                        ),               
                    array(
                            '1'=>'city',
                            '2'=>'searchParams',
                            '3'=>'page'

                        )                
                    , 'fooroute,%s,%s,%d'                    
                )
    );

1 个答案:

答案 0 :(得分:1)

您不需要在字符集中转义+。你不需要逃避,

此外,使用i ignorecase )标记会使您的模式更小,因为您不必每次都使用a-zA-Z。使用以下模式:

^fooroute(?:(?:,([a-z+]+))?(?:,(p\d+))?(?:,(\d+))?)?$

Regular expression visualization