PCRE:\ w在不同服务器上的不同行为
我为我自己的应用程序使用Kohana的路由系统,并且在为url的标记定义pcre模式时,我的本地主机的行为与生产服务器的行为不同。PCRE: w在不同服务器上的不同行为
我有这样的路线:
Route::set('list', 'list(/tagged/<tags>)',
array('tags'=>'[\w\d\-\+]+'));
这用来做工精细,直到有一天有人用含有不“标准”字符(N)的标签。在我的本地主机中没有问题,但在生产服务器中,系统无法找到路由。
在生产代码中,我需要修改该模式,并明确地将'ñ'添加到允许的字符中!
'\pL[\w\d\-\+ñ]+'
问题是,为什么?好吧,它现在起作用了,我添加了' - ',但它迟早会再次失败!
看一看不同的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。
由于\w
的含义与语言环境有关,因此生产服务器可能具有干净的C语言环境,而开发系统包含扩展字符代码。
使用/u
unicode修饰符的IIRC允许\w
匹配所有“字母”字符。如果Kohana不允许指定修饰符,请将其与(?u)[...]
内联添加。或者,也许在你的情况,你只需要在方括号内重复\p{L}
:
'\pL[\w\d\-\+\p{L}]+'
kohana系统将/ u添加到最终模式,仍然无法工作,反正我不知道区域设置行为。 – 2010-12-04 19:25:06
Kohana使用“u”修饰符进行匹配,因此可能意味着PCRE未使用Unicode支持进行编译,或者您未使用UTF-8语言环境。 – shadowhand 2010-12-10 09:32:51
我认为系统支持unicode,因为install.php告诉我。我敢打赌是@ mario指出的区域设置 – 2010-12-11 07:47:09