2015-09-28 98 views
3

我希望我的路由支持波斯字符,但是当在正则表达式路径中使用x {600} - \ x {6FF}时,应用会给我一个404错误(找不到页面)zend框架2使用UTF-8正则表达式路由

我ZF2路由配置:

'result' => array(
       'type' => 'segment', 
       'options' => array(     
        'route' => '/Result[/:name]', 
        'constraints' => array(
         'name' => '[\sa-zA-Z0-9_.-x{600}-\x{6FF}]*', 

        ), 
        'defaults' => array(
         'controller' => 'Result', 
         'action'  => 'index', 
        ), 
       ), 
      ), 

,我添加u结束在Zend的\的mvc \路由器正则表达式的\ HTTP \ Segment.php

if ($pathOffset !== null) { 
      $result = preg_match('(\G' . $regex . ')u', $path, $matches,null, $pathOffset); 
     } else { 
      $result = preg_match('(^' . $regex . '$)u', $path, $matches); 
     } 

我的网址是这样的:

http://localhost/test/Result/A.8.کلمه 
+0

尝试''[\ sa-zA-Z0-9 _。\ x {600} - \ x {6FF} - ] *''。 –

+0

我尝试使用上面的代码,但给我404错误 –

+0

看来你需要将'rawurldecode($ path);'传递给'preg_match'。请尝试使用上述正则表达式。 –

回答

0

在字符类问题中有一个错位的连字符,在第一个x{600}之前缺少\。这里是如何的hyphen changes the meaning of the pattern

enter image description here

要解决它,你需要把它移动到字符类的末尾:

'[\sa-zA-Z0-9_.\x{600}-\x{6FF}-]*' 

another demo

请注意,如果您需要任何更多的字符添加到模式,你应该小心[]-/。他们必须逃避以避免问题。例如,加入%

'[%\sa-zA-Z0-9_.\x{600}-\x{6FF}-]*' 

接下来的问题是,你需要传递rawurldecode($path)preg_match,而不是仅仅$path

+0

很高兴为你效劳。如果我的答案对您有帮助,请考虑也是upvoting(请参阅[如何在堆栈溢出?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)) 。 –