PCRE:\ w在不同服务器上的行为不同

时间:2010-12-04 18:59:17

标签: php kohana pcre

我正在使用Kohana的路由系统作为我自己的应用程序,并且在为url的标记定义pcre模式时,我的localhost与生产服务器的行为不同。

我有这条路线:

Route::set( 'list', 'list(/tagged/<tags>)',
            array('tags'=>'[\w\d\-\+]+') );

以前工作正常,直到有人使用不包含“标准”字符的标签(ñ)。在我的localhost中没有问题,但在生产服务器中,系统无法找到路由。

在生产代码中,我需要修改模式并明确地将'ñ'添加到允许的字符中!

'\pL[\w\d\-\+ñ]+'

问题是,为什么?好的,它现在可以添加'ñ',但迟早会再次失败!

2 个答案:

答案 0 :(得分:3)

由于\w的含义与语言环境有关,因此您的生产服务器可能具有干净的C语言环境,而您的开发系统包含扩展字符代码。

IIRC使用/u unicode修饰符允许\w匹配所有“字母”字符。如果Kohana不允许指定修饰符,请将其与(?u)[...]内联添加。或者在您的情况下,您只需要在方括号内重复\p{L}

'\pL[\w\d\-\+\p{L}]+'

答案 1 :(得分:3)

看看你可以在这里使用的不同的Unicode角色类:http://www.regular-expressions.info/unicode.html#prop话虽如此,你可以使用这样的东西:

Route::set('list', 'list(/tagged/<tags>)', array('tags'=>'[\p{L}\p{N}\-\+]+'));
  1. \p{L}来自任何语言的任何信件。
  2. \p{N}任何脚本中的任何数字字符。
  3. 我在ideone.com上对此进行了测试。 View example