preg_match_all - подскажите по паттерну плиз

jer

...
preg_match_all - подскажите по паттерну плиз

глупый вопрос:

PHP:
$string = '&aaa=111&bbb=222&ccc=333';
preg_match_all("/^(&([a-z]+)=([0-9]*))*$/iU", $string, $matches);
print_r($matches);
находит только последнее вхождение:

Array
(
[0] => Array
(
[0] => &aaa=111&bbb=222&ccc=333
)

[1] => Array
(
[0] => &ccc=333
)

[2] => Array
(
[0] => ccc
)

[3] => Array
(
[0] => 333
)
)

а нужно все пары [имя]=[значение] найти

в чем я ошибаюсь? что-то не пойму...;-/
 

Screjet

Новичок
Используй
PHP:
preg_replace_callback("/([a-z]+)=([0-9]+)/i", ...)
(читай ман про ф-цию, и см. примеры)
так проще разобрать строку.
 

Screjet

Новичок
untied, неправильно!
Либо советуй то, в чем уверен, либо ничего не соверуй. А лучше почитай ман.
 

jer

...
Screjet

ок, читаю...

но не понятно почему мой вариант не работает, хотя без прибивания к началу и концу строки срабатывает. но это не совсем то, что нужно.
 

Screjet

Новичок
jer

чессно: запрос должен быть рекурсивным, а как заставить в пхп работать рекурсивные запросы = понятия не имею :)
(все убитое на это время = было потрачено зря)
 

jer

...
Frol, сначала хотел сказать что "это не то", т.к. я указал частный случай, а разделители могут быть разные, но если предварительно заменить разделители на &, то должно помочь :)
спасибо, что натолкнул на эту мысль!
 

Profic

just Profic (PHP5 BetaTeam)
jer
/^(&([a-z]+)=([0-9]*))*$/iU
Можно поинтересоваться, зачем в регулярке, пихаемой в [m]preg_match_all[/m]() подчеркнутые символы? После ответа на этот вопрос первоначальный, думаю, отпадет сам.
Screjet
Все работает (это я про рекурсию), только нужно с ней немного пошаманить :) Самое главное незабывать для (?R) дать возможность совпасть 0 раз :)
 

jer

...
Profic
ммм... пожалуй, ты прав, на то он и match_all. просто хотелось, чтобы ничего лишнего в строке не присутствовало ;) поэтому и пытался прибить к началу и концу строки.

перечень входных переменных и их типы у меня заранее известны (этим регом я разбираю QUERY_STRING) и сначала я хотел составлять готовый regexp под конкретный набор входных переменных + можно сразу сделать проверку на их тип. что-то вроде /^&(var1)=([0-9]{1,3})&(var2)=([0-9]{1,6})&(var3)=([0-9a-z]{1,16})$/ (порядок следования переменных может быть только одним!) идея показалась очень даже удобной, т.к. одним выстрелом делаем и валидацию и разбор запроса, но для правильной логики работы "движка" все-таки надо сначала разобрать запрос, а потом проверять набор переменных (их типы и прочее). поэтому остановился пока на parse_str, с предварительной подготовкой строки. хотя это и дольше работает.
 
Сверху