2010-12-04 85 views
0

我为我自己的应用程序使用Kohana的路由系统,并且在为url的标记定义pcre模式时,我的本地主机的行为与生产服务器的行为不同。PCRE: w在不同服务器上的不同行为

我有这样的路线:

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

这用来做工精细,直到有一天有人用含有不“标准”字符(N)的标签。在我的本地主机中没有问题,但在生产服务器中,系统无法找到路由。

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

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

问题是,为什么?好吧,它现在起作用了,我添加了' - ',但它迟早会再次失败!

+0

Kohana使用“u”修饰符进行匹配,因此可能意味着PCRE未使用Unicode支持进行编译,或者您未使用UTF-8语言环境。 – shadowhand 2010-12-10 09:32:51

+0

我认为系统支持unicode,因为install.php告诉我。我敢打赌是@ mario指出的区域设置 – 2010-12-11 07:47:09

回答

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}任何脚本中的任何种类的数字字符。

我已经在ideone.com上测试过了。 View example

3

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

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

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

kohana系统将/ u添加到最终模式,仍然无法工作,反正我不知道区域设置行为。 – 2010-12-04 19:25:06

相关问题