Сопоставление и хранение нескольких строк в одной строке с помощью регулярных выражений и PHP - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь превратить 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». Он также соответствует множеству ненужных пустых строк.

1 Ответ

1 голос
/ 28 марта 2012

Попробуйте использовать preg_match_all и посмотрите, поможет ли это.preg_match останавливается после того, как находит первое совпадение.

Чтобы избавиться от совпадения 1 («категория / музыка»), попробуйте использовать группу без захвата, так что:

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

вместо

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