2010-12-04 17 views
0

自分のアプリケーションにKohanaのルーティングシステムを使用しています。urlのタグにpcreパターンを定義すると、localhostはプロダクションサーバーとは動作が異なります。PCRE:異なるサーバーで wの動作が異なります

私はこのルートを持っている:

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

これは、誰かがいない「標準」の文字(N)を含有していたタグを使用日まで、正常に動作するために使用。私のlocalhostには問題はありませんが、運用サーバーではシステムがそのルートを見つけられません。

プロダクションコードでは、パターンを修正し、許可された文字に明示的に 'ñ'を追加する必要があります。

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

質問は、なぜですか?さて、私は 'ñ'を追加しましたが、遅かれ早かれ、再び失敗するでしょう!

+0

Kohanaは一致に "u"修飾子を使用するため、PCREがUnicodeサポートでコンパイルされていないか、UTF-8ロケールを使用していない可能性があります。 – shadowhand

+0

私はユニコードがシステム上でサポートされていると思うので、install.phpはそう言います。私はロケール設定@marioが指摘されている –

答えて

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

+0

それは働いた!私はそのパラメータを知らなかった、ありがとう –

3

\wの意味はロケールに依存するため、プロダクションサーバーにはクリーンなCロケールがありますが、開発システムには拡張文字コードが含まれている可能性があります。

/uユニコード修飾子を使用すると、\wはすべての「文字」文字に一致することができます。 Kohanaが修飾子を指定できない場合は、(?u)[...]とインラインで追加します。それとも、あなたのケースであなただけの角括弧内\p{L}を繰り返す必要があります。

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

最後のパターンに/ uを追加するkohanaシステムの終了、まだ動作していない、とにかく私はロケールの動作を知らなかった。 –

関連する問題