2010-11-24 19 views
0

誰かが私にこれをやる方法を教えてもらえますか?私は3弦を持っています。文字列を比較して変数を抽出しますか?

$route = '/user/$1/profile/$2'; 
$path = '/user/profile/$1/$2'; 
$url = '/user/jason/profile/friends'; 

私がする必要があるのは、URLがルートに準拠しているかどうかを確認することです。私はこれを次のようにしようとしています。

$route_segments = explode('/', $route); 
$url_segments = explode('/', $url); 

$count = count($url_segments); 
for($i=0; $i < $count; $i++) { 
    if ($route_segments[$i] != $url_segments[$i] && ! preg_match('/\$[0-9]/', $route_segments[$i])) { 
    return false; 
    } 
} 

正規表現の動作を前提としていますが、それは私がこれまでに書いたことのないものです。 :D

これは私が立ち往生しているところです。私はこの配列で、私はその後、$ path変数にこれらの値をstr_replaceことができることを前提とし

array (
    '$1' => 'jason', 
    '$2' => 'friends' 
); 

$route = '/user/$1/profile/$2'; 
$url = '/user/jason/profile/friends'; 

は、だから私はで終わる:どのように私は、次の文字列を比較するのですか?

答えて

1
$route_segments = explode('/',$route); 
$url_segments = explode('/',$url); 
$combined_segments = array_combine($route_segments,$url_segments); 

未定義の配列長と反応する方法は不明ですが、これはおそらく要素と要素のマッチングに関するものです。その後、配列をかなり反復して$を探し、それを置き換えるために他の値を使用することができます。

EDITあなたは、これは文字列(これの\ X24)の終わりのためのフラグであるため、正規表現に$を「エスケープ」する必要があります除く閉じる正規表現の

/^\x24[0-9]+$/ 

。 [0-9] +は1+数に一致します。 ^は文字列の先頭に一致し、$の意味は最後に一致します。これは、それが常にドル記号で、次に数字であることを保証します。

(実際には、netcoderは素敵なソリューションを持っている)

+0

私はこの解決策が好きで、そのシンプルでポイントです。正規表現のヒントをありがとう。 – JasonS

1

私は自分自身の小さな枠組みの中で似た何かをしました。 ^\/user\/([^/]*)/profile/([^/]*)\/$

私は、正規表現の一致するかどうかを確認:解析パラメータのできる正規表現に/user/$1/profile/$2

私のソリューションは、テンプレートのURLを変換することでした。

必要に応じてmy controller codeをご覧ください。

+0

私の小さなアプリケーションの主なセールスポイントはシンプルさです。私はこれがこの原則に反すると感じています。おかげさまで良いソリューションです。 – JasonS

+0

私はあなたが私の議論を誤解したと思います。私はあなたのより自然な言語の代わりに正規表現を入力するようにあなたのユーザに頼んでいることを示唆していませんでした。現在のURLをより簡単に照合するために、実行時に自然言語のURLパターンをregexpに変換することをお勧めします。 –

1

あなたはこれを行うことができます:

$route = '/user/$1/profile/$2'; 
$path = '/user/profile/$1/$2'; 
$url = '/user/jason/profile/friends'; 

$regex_route = '#'.preg_replace('/\$[0-9]+/', '([^/]*)', $route).'#'; 
if (preg_match($regex_route, $url, $matches)) { 
    $real_path = $path; 
    for ($i=1; $i<count($matches); $i++) { 
     $real_path = str_replace('$'.$i, $matches[$i], $real_path); 
    } 
    echo $real_path; // outputs /user/profile/jason/friends 
} else { 
    // route does not match 
} 
0

あなたは同じ番号(?P<_n>[^/]+)named groupによって$nのいずれかの発生を置き換えることができ、その後preg_matchためのパターンとしてそれを使用します。

$route = '/user/$1/profile/$2'; 
$path = '/user/profile/$1/$2'; 
$url = '/user/jason/profile/friends'; 

$pattern = '~^' . preg_replace('/\\\\\$([1-9]\d*)/', '(?P<_$1>[^/]+)', preg_quote($route, '~')) . '$~'; 
if (preg_match($pattern, $url, $match)) { 
    var_dump($match); 
} 

このプリントを中この場合:

array(5) { 
    [0]=> 
    string(28) "/user/jason/profile/friends" 
    ["_1"]=> 
    string(5) "jason" 
    [1]=> 
    string(5) "jason" 
    ["_2"]=> 
    string(7) "friends" 
    [2]=> 
    string(7) "friends" 
} 

正規表現を使用すると、パスの任意の位置でワイルドカードを使用できます。/~jason/の場合は/~$1/も機能します)。名前付きサブパターンを使用すると、任意の順序を使用できます(例:/$2/$1/も同様です)。

また、クイックフェイルの場合は、atomic grouping syntax (?>…)を追加で使用できます。

関連する問題