Я пытаюсь превратить URI в пары ключ и значение в созданном мной классе URI. URI чистые и не могут быть проанализированы в переменной $ _GET. Решение должно быть в PHP, а не в Apache mod_rewrite.
Рассмотрим этот URI: / категория / музыка / строки = 30 / страница = 12 /
Нужные пары ключ-значение, которые я хочу получить, это:
массив ('category' <= 'music', 'row' <= '30', 'page' <= '12') </p>
Чтобы попытаться добиться этого, я написал следующий пример кода:
$arr = array();
preg_match('/(category\/(?<category>[\w-_]+)|rows=(?<rows>\d+)|page=(?<page>\d+))+/',
"category/music/rows=30/page=12", $arr);
var_dump($arr);
Выходы:
array
0 => string 'category/music' (length=14)
1 => string 'category/music' (length=14)
'category' => string 'music' (length=5)
2 => string 'music' (length=5)
Думал, что я хочу сопоставить кого-либо в группе (/ (сопоставить это | или это | или это) + /) один или несколько раз Я предполагаю, что проблема здесь в том, что он совпадает один раз, а затем останавливается. Кроме того, скобки, которые группируют оператор или, вызывают совпадения, которые не нужно хранить (строка «категория / музыка» не требуется).
Я, наверное, упустил что-то очевидное, но не могу понять. Я понимаю, что могу запустить preg_match три раза, но, похоже, должен быть способ сделать это в одном выражении. Я также хочу, чтобы код был коротким.
Edit:
preg_match_all работает, и я изменил регулярное выражение так:
/ категория / ([\ ш -_] +?) | Строки = (\ d +?) | (? \ D +) страница = /
Однако теперь я получаю такой результат:
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)
Было бы идеально, если бы в нем не хранились также «категория / музыка», «строки + 30», «страница = 12». Он также соответствует множеству ненужных пустых строк.