2017-01-25 15 views
0

ルートが存在するか、配列内のルートが文字列か、ルートが文字列の配列に格納されているかどうかを確認する必要があります。 routes [0] = 'posts/all/{postID}'(中括弧とパラメータ名に注意してください)。ユーザーがurl 'post/all/4'でサイトに入ったとします。ブラウザーで入力されたURLと中括弧とパラメーター名が一致するようにするにはどうすればいいですか?配列に一致するものがある場合は、中括弧でパラメーターの前のURLの一部のみを取得し、この関数の元の名前で中括弧内の変数(配列[params ['postID'] = 4など)でもかまいませんか?中括弧で囲まれたPHP動的URL変数

答えて

1

これは参考になる基本バージョンです。まず、パスと変数を正規表現に変換します。次に、着信URLをそれぞれに対して順番にチェックします。一致するものが見つかった場合は、パスと変数をurl関数に渡します。

$incomingUrl = 'posts/all/123'; 
$routes = ['posts/all/{postID}', 'users/all/{userID}', 'pasta/all/{pastaID}']; 

// Parse your url templates into regular expressions. 
$routeRegexes = []; 
foreach ($routes as $route) { 
    $parts = []; 
    $partsRegex = '`(.+?){(.+?)}`'; 
    preg_match($partsRegex, $route, $parts); 
    $routeRegexes[] = [ 
     'path' => $parts[1], 
     'varName' => $parts[2], 
     'routeRegex' => "`($parts[1])(.+)`" 
    ]; 
} 
print_r($routeRegexes); 

// Check the incoming url for a match to one of your route regexes.  
$urlMatch = null; 
foreach ($routeRegexes as $routeRegex) { 
    if (preg_match($routeRegex['routeRegex'], $incomingUrl, $urlMatch)) { 
     $routeRegex['varValue'] = $urlMatch['2']; 
     $urlMatch = $routeRegex; 
     break; 
    } 
} 
print_r($urlMatch); 

if (!empty($urlMatch)) { 
    $path = $urlMatch['path']; 
    $variableName = $urlMatch['varName']; 
    $variableValue = $urlMatch['varValue']; 
    echo "Path: $path\n"; 
    echo "Variable name: $variableName\n"; 
    echo "Variable value: $variableValue\n"; 

    // Pass the variables to your url function. 
    // callUrl($path, [$variableName => $variableValue]); 
} else { 
    // Throw 404 path not found error. 
} 

これが正しい方向に向いていますか?

+0

本当に助かりました。ありがとうございます! – artus90

+0

問題ありません。私はあなたが灰色のダニをクリックして答えを受け入れると、それは私たちに両方の評判を与えるだろうと思う。 – tobuslieven

+1

もちろん:-) thx – artus90