2010-11-18 19 views
3

PHPでURLルーターを作成しようとしていますが、これはdjangoのように動作します。PHPのpreg_match URLの一部

問題は、私はPHPの正規表現をよく知らないです。

私はこのようなURLにマッチできるようにしたいと思います:

/post/5/ 
/article/slug-goes-here/ 

私は正規表現の配列を持っている:

$urls = array(  
    "(^[/]$)" => "home.index",  
    "/post/(?P<post_id>\d+)/" => "home.post",  
); 

配列の最初の正規表現は、自宅に一致するように動作しますページは/ですが、私は2番目のものを動作させることができません。ここで

は、私はそれらを一致させるために使用していたコードです:

foreach($urls as $regex => $mapper) { 
    if (preg_match($regex, $uri, $matches)) { 
    ... 
    } 
} 

私も上記の例では、私はURLでpost_idと一致するようにしようとしていますことに注意してください:/post/5/私は5を渡すことができるように私の方法に沿って。

+0

正規表現は、適切な区切り文字を持っている必要があり – stillstanding

答えて

3

正規表現を区切る必要があります。区切りは、あなたが「オプション」(「i」は大文字小文字を区別しないマッチングのためのような)パターンの一部として提供することができます:

ここ
,/post/(?P<post_id>\d+)/, 

を、私はカンマで区切られた正規表現をしています。

あなたの正規表現は/で区切られていました。つまり、2番目以降のすべてのものを 'オプション'として扱い、「投稿」部分にマッチさせようとしていました。

あなたの現在の正規表現に基づいてあなたが実際にしているものではないように見せようとしている例があります。

次のような正規表現の後ろにある場合は、

その後
/post/P1234/ 

、以下:

preg_match(',/post/(P\d+)/,', '/post/P1234/', $matches); 
print_r($matches); 

がになります:

Array 
(
    [0] => /post/P1234/ 
    [1] => P1234 
) 

うまくいけば、あなたのためにそれをクリア:)

編集

はあなたのOPにコメントをもとに、あなただけのURLの/ポスト/パートの後に番号と一致するようにしようとしているので、この少し簡略化されたバージョン:

Array 
(
    [0] => /post/1234/ 
    [1] => 1234 
) 

preg_match(',/post/(\d+)/,', '/post/1234/', $matches); 
print_r($matches); 

はになります

+0

ああ、あなたは私の夜行われ、感謝!私はあなたにこれに20票を与えることができればと思います。 – imns

+0

問題はありません。私が最初に始めたときに正規表現を区切ることはかなり数回ありましたが、php.netにもその説明はありません! –

1

2番目の正規表現は、物品/ナメクジ-行く - ここに/ /のようなURLに一致するように意図されている場合は、正しい正規表現は

それを行う必要があります
#\/article\/[\w-]+\/# 

です! /をエスケープしなくてはいけないとはっきりしていないので、エスケープせずに試してみることができます。そのフレームワークはこのようなタグを使用して一致するグループに名前を付けるので、.NETの例では推測のタグが抽出されます。

私は助けになることを願っています!

1

php 5.2.2:名前付きサブパターンは、(?<name>)(?'name')(?P<name>)の構文を受け入れるようになりました。以前のバージョンは (?P<name>)のみ受け付けました。

http://php.net/manual/fr/function.preg-match.php