2

CakePHP ルートで次の変更を行いたいと考えています。example.com/somewordまたはのような Web サイト URL の後にある単語または単語のグループ (ハイフンで区切られている) は、example.com/some-wordにリダイレクトされcontroller => posts, action => viewます。しかし、私の問題は、単語がユニコードでなければならないことです。URL テキストに対してこの正規表現を試しましたが、うまくいきません。

Router::connect ( '/:link', 配列 ('controller' => 'posts', 'action' => 'view' ), array ('pass' => array ('link'), 'link' = > '/^['.json_decode('"\u0531"').'-'.json_decode('"\u0587"').'-]+$/u' ) );

ただし、私の正規表現は

'/^['.json_decode('"\u0531"').'-'.json_decode('"\u0587"').'-]+$/u',

通常の preg_match のようなものを実行しようとしている場合、問題なく動作します

$regg = '/^['.json_decode('"\u0531"').'-'.json_decode('"\u0587"').'-]+$/u';
if (preg_match($regg, "my unicode string", $match)) {
  var_dump($match);   // outputs string as expected
}
die;

編集

私はこのコードを持ってしまいます

Router::connect ( '/:link', array ('controller' => 'posts', 'action' => 'view' ), array    ('pass' => array ('link'), 'link' => '((?![a-zA-Z]).)+' ) ); 

URL に英語以外のすべてを含めるようにしますが、英語以外の言語が 2 つ以上ある場合、これは必要ありません。この方法は機能しません。そこで、各言語の単語を別々のアクションに送りたいと思います。

ケーキ バージョン 2.x

編集2

以下の回答のように、質問を回避するための代替ソリューションがありますが、必要なことを正確に行う方法を探しています。

ありがとう

4

2 に答える 2

0

URL エンコードパラグラフのhttp://en.wikipedia.org/wiki/Query_stringから、URL クエリ文字列でこれらの文字を使用することはできません。

特に、クエリ文字列のエンコードでは、次の規則が使用されます。

  • 文字 (A ~ Z および a ~ z)、数字 (0 ~ 9)、および文字「.」、「-」、「~」、および「_」はそのまま残されます。
  • スペースは「+」または「%20」としてエンコードされます [8]
  • 他のすべての文字は、最初に UTF-8 (または他の指定されたエンコーディング) としてエンコードされた非 ASCII 文字とともに、%HH 16 進表現としてエンコードされます。

2 つ (またはそれ以上) の言語を使用している場合は、posts テーブルに言語ごとに 1 つのスラッグ フィールドを追加することを検討できます。たとえば、英語とロシア語の場合です。

投稿

  • ID
  • title_eng
  • title_rus
  • slug_eng
  • slug_rus

Post.php beforeValidate または beforeSave:

if(isset($this->data['Post']['title_eng'])){
    $this->data['Post']['slug_eng'] = Inflector::slug(strtolower($this->data['Post']['title_eng']), '-');
}
if(isset($this->data['Post']['title_rus'])){
    $this->data['Post']['slug_rus'] = Inflector::slug(strtolower($this->data['Post']['title_rus']), '-');
}

ビュー内のリンク:

echo $this->Html->link($post['Post']['title_eng'], array('controller' => 'posts', 'action' => 'view', 'slug_eng' => $post['Post']['slug_eng']));
echo $this->Html->link($post['Post']['title_rus'], array('controller' => 'posts', 'action' => 'view', 'slug_rus' => $post['Post']['slug_rus']));    

ルート:

Router::connect('/posts/:slug_eng', array('controller' => 'posts','action' => 'view', 'eng'), array('pass' => array('slug_eng'), 'slug_eng' => '[a-zA-Z0-9]+'));
Router::connect('/ru/posts/:slug_rus', array('controller' => 'posts','action' => 'view', 'rus'), array('pass' => array('slug_rus'), 'slug_rus' => '[a-zA-Z0-9]+'));

コントローラーの投稿:

public function view($locale, $slug){
    ....
    validate and sanitize here
    ...
    $post = $this->Post->find('first', array('conditions' => array('slug_' . $locale => $slug)));
    ....
}
于 2013-11-19T17:50:33.330 に答える