2012-03-28 2 views
0

URIクラスでURIとキーと値のペアにURIを変換しようとしています。 URIはきれいで、$ _GET変数に解析できません。解決策は、Apacheのmod_rewriteではなく、PHP内になければなりません。正規表現とPHPを使用して複数の文字列を1つの文字列にマッチして格納する

このURI考えてみましょう:私はこのことからしたい目的のキーと値のペアが、これらは/カテゴリ/音楽/行= 30 /ページ= 12/

配列( 'カテゴリ' < = '音楽'、 '行' < = '30'、 'ページ' < = '12')

をしようとすると、私は番目の書いた本を達成あるいは、この| |

array 
    0 => string 'category/music' (length=14) 
    1 => string 'category/music' (length=14) 
    'category' => string 'music' (length=5) 
    2 => string 'music' (length=5) 

思考は、私はグループ内のいずれにもマッチしたいということでした(/(これを一致:

$arr = array(); 
preg_match('/(category\/(?<category>[\w-_]+)|rows=(?<rows>\d+)|page=(?<page>\d+))+/', 
     "category/music/rows=30/page=12", $arr); 
var_dump($arr); 

出力:サンプルコードでありますまたはこれ)+ /)を1回以上繰り返します。私はここで問題があると仮定しています。また、そのor文をグループ化する括弧は、格納する必要のない一致を引き起こします(文字列 "category/music"は必須ではありません)。

私は恐らく何かを見逃しているかもしれませんが、私はそれを理解できません。私はpreg_matchを3回走らせることができることは分かっていますが、1つの表現でそれを行う方法がなければならないようです。私はまた、コードを短くしたい。

編集: preg_match_all作品が、私はこれに正規表現を変更しています(?[\ -_ W] +)|(?\ D +)

/カテゴリ/行= |ページ= (?\ dは+)/

しかし、私は今、このような結果を得る: "行+ 30"、それも "カテゴリ/音楽" を記憶していない場合、それは理想的である

array 
    0 => 
    array 
     0 => string 'category/music' (length=14) 
     1 => string 'rows=30' (length=7) 
     2 => string 'page=12' (length=7) 
    'category' => 
    array 
     0 => string 'music' (length=5) 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
    1 => 
    array 
     0 => string 'music' (length=5) 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
    'rows' => 
    array 
     0 => string '' (length=0) 
     1 => string '30' (length=2) 
     2 => string '' (length=0) 
    2 => 
    array 
     0 => string '' (length=0) 
     1 => string '30' (length=2) 
     2 => string '' (length=0) 
    'page' => 
    array 
     0 => string '' (length=0) 
     1 => string '' (length=0) 
     2 => string '12' (length=2) 
    3 => 
    array 
     0 => string '' (length=0) 
     1 => string '' (length=0) 
     2 => string '12' (length=2) 

を、 "page = 12"となります。また、多くの不必要な空白文字列と一致しています。

答えて

1

preg_match_allを試してみてください。 preg_matchは、最初の一致が見つかると停止します。

がマッチ1( 'カテゴリー/音楽')を取り除くために、非キャプチャグループを使用しよう、そう:

(?:category\/(?<category>[\w-_]+) 

代わりの

(category\/(?<category>[\w-_]+) 
+0

ああ優れ、preg_match_allをん確かに私はそれがこの正確な目的のために作られたことを気付かなかったことは信じられません。しかし、正規表現だけでそれを行う方法があるのだろうかと思います。 preg_match_allを使用すると、 '/ category \ /(? [\ w -_] +)| rows =(? \ d +)| page =(? \ d +)/'とすることができます。私はまだ 'category/music'' rows = 30'と' page = 12'にマッチします。私は見続けるだろう。 – Jonathan

関連する問題