CakePHP路由正则表达式无法正确匹配

时间:2015-02-26 23:21:35

标签: php regex cakephp routes

将我的CakePHP版本从2.2.2更新到2.6.2后,我的一条路线停止正常工作。

Router::connect('/articles/:keywords', array('action' => 'search', 'controller' => 'Articles', 'keywords' => null), array('pass' => array('keywords'), 'keywords' => '[A-Za-z0-9\+_]+'));

需要输入诸如" World"和#34;世界+新闻"通过诸如website.com/articles/World+News之类的网址,将文章/之后的内容传递给文章控制器中的搜索功能。这个工作正常,直到更新。现在它将通过路线并转到我的"找不到路线"路由,如果有除字母数字字符以外的任何内容。就像正则表达式没有正确匹配一样。例如"世界"和" World123"会工作,但"世界+新闻"不会。

我尝试过的事情:

  1. 将正则表达式更改为。*只是为了查看它是否有效。它确实。
  2. 将路线从:关键字更改为*只是为了查看它是否有效。它确实。
  3. 尝试我认识的事情会失败,例如在比赛中排除任何字母。它无法按预期使用此路线。
  4. 我到处搜寻,尝试各种正则表达式组合(我在测试者中成功匹配的组合),并且通常只是试图找出为什么这条路线会匹配,但我不能。这在更新之前工作正常,我无法在CakePHP文档中找到任何可以说明为什么它不起作用的内容。据我所知,表达式是正确的,我已经确认它们使用正则表达式测试器完全匹配。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

实际上问题正则表达式,至少它是问题的部分

在早期版本中,CakePHP将原始URL传递给匹配的主题,但这有点问题,因为它可能需要非常难看的正则表达式,特别是对于非ASCII字符。现在传递了URL解码的变体:

<强> https://github.com/cakephp/.../commit/d5283af818b59c5d96355d6e42bbd77e1322d8cb

因为+在URL编码中具有特殊含义并且实际上代表空格,所以正则表达式将不再匹配。它很容易修复,只需匹配空格而不是+