我正在使用Kohana的路由系统作为我自己的应用程序,并且在为url的标记定义pcre模式时,我的localhost与生产服务器的行为不同。
我有这条路线:
Route::set( 'list', 'list(/tagged/<tags>)',
array('tags'=>'[\w\d\-\+]+') );
以前工作正常,直到有人使用不包含“标准”字符的标签(ñ)。在我的localhost中没有问题,但在生产服务器中,系统无法找到路由。
在生产代码中,我需要修改模式并明确地将'ñ'添加到允许的字符中!
'\pL[\w\d\-\+ñ]+'
问题是,为什么?好的,它现在可以添加'ñ',但迟早会再次失败!
答案 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}\-\+]+'));
\p{L}
来自任何语言的任何信件。\p{N}
任何脚本中的任何数字字符。我在ideone.com上对此进行了测试。 View example