3

すべてのルート/URL とそのパスを含む配列があります。

Example : $route = array(
'/' => 'files/index.php',
'pages' => 'files/pages.php',
'pages/add' => 'files/page-add.php',
'posts/*' => 'files/posts.php',
)

array_key_exists() を使用して、配列にルートが存在するかどうかを確認し、存在する場合はそのパスをロードし、直接一致が見つかった場合に機能します。

posts/*へのリクエストが行われるたびにパスに一致させたいのですposts/anything, posts/view/10が、array_key_exists() を使用してこれを行うことはできません。

どの方法を使用すべきかについてのアイデア/提案はありますか?

4

2 に答える 2

4

次の 2 つの戦略を組み合わせて実行します。

  • 直接一致する場合は、「ルーティング アレイ」を使用してください。これは、優れたパフォーマンスを備えた安全なソリューションです。
  • 直接一致しなかった残りのリクエストについては、通常は phpspreg_match()関数を使用して、正規表現ベースのパターン マッチングなどの追加の戦略を試してください。これにより、パターンを記述する無限の可能性が得られますが、直接一致を探すよりも明らかに遅くなります。
于 2012-10-21T09:16:43.263 に答える
0

を使用できますが、失敗した場合は、キーでarray_key_exists()a を検出したルートを試してください。*

if (array_key_exists($url, $route)) {
   // Serve normally.
} else {

    $route = array_filter($route, function($route) { 
                     if (substr($route, -1) != "*") {
                        return FALSE;
                     }

                     return (substr($url, 0, strlen($route)) != substr($route, 0, -1));
               });

    if ($route) {
       // Serve normally.
       $route = end($route);

    } else {
       // Route wasn't matched.
    }

}
于 2012-10-21T09:19:36.543 に答える