1

文字列からパラメーターを抽出しようとして、約 2 時間座っています。パラメータの数に関係なく。

これを考えてみましょう(例)、

$template = "/category/(:any)/(:any)/(:any)/";
$input    = "/category/username/category-id/2";

And I would like an array of parameters to be like this,

Array (
    [0] => username
    [1] => category-id
    [2] => 2
)

だから、私はから始めました、

$replacements = array(
    '(:any)'        =>  '.+(?=/|$)',
);

$str = '/category/(:any)/(:any)/(:any)';
$str = str_replace(array_keys($replacements), array_values($replacements), $str);

$input = '/category/username/category-id/2';

$pattern = '~^' . $str . '$~';

preg_match($pattern, $input, $matches);

print_r($matches);

// That prints Array ( [0] => /category/username/category-id/2 ) 

しかし今、私は適切なパラメータ抽出にこだわっています。最初に頭に浮かぶのは、2 つの文字列間で類似した値を見つけて削除することです。(:any)次に、と を取り外し/ます。

$template = "/category/(:any)/(:any)/(:any)/";
$input    = "/category/username/category-id/2";

問題は、に依存する多くの余分な作業が必要になることですexplode()

問題は次のとおりです:(最初のコード例を見てください):どうすれば正規表現を使用してそれを適切に達成できます$matchesか?

4

3 に答える 3

1

私はこの正規表現がうまくいくはずだと信じています:

$replacements = array(
    '(:any)'        =>  '([^/]*)',
);

$template = "/category/(:any)/(:any)/(:any)/";
$input    = "/category/username/category-id/2";

$str = '/category/(:any)/(:any)/(:any)';
$str = str_replace(array_keys($replacements), array_values($replacements), $str);

$input = '/category/username/category-id/2';

$pattern = '~^' . $str . '$~';

preg_match($pattern, $input, $matches);

print_r($matches);

出力:

Array
(
    [0] => /category/username/category-id/2
    [1] => username
    [2] => category-id
    [3] => 2
)
于 2013-10-25T07:04:33.297 に答える