RegExp не выходит. В чем ошибка?

AntonTo

Guest
RegExp не выходит. В чем ошибка?

Делаю preg_replace($pattern, $replacement, $string)

string: aa=abcde&bb=abcdef
pattern: /aa=.*[^&]/U
replacement: xx=123456789

на выходе получаю
xx=123456789bcde&bb=abcdeee
вместо ожидаемых
xx=123456789&bb=abcdef

Подскажите плиз, в чем ошибка? Почему не срабатывает конструкция .* ???
 

Demiurg

Guest
она "срабатывет", ты сам отключил жадноость.
Попробуй сначала русским языком описать свое регулярное выражение
 

AntonTo

Guest
хм, если я отключаю жадность он возвращает
xx=123456789
вместо ожидаемых
xx=123456789&bb=abcdef
 

AntonTo

Guest
вообщем задача вроде не сложная, надо в запросе вида: name=value&name1=value1&name2=value2...
(т.е. список именованых параметров в URL, пары отделяются друг от друга символом &, name и value могут состоять из любого количества символов) заменить одну пару имя/значение на другую. При этом имя изменяемого параметра мы знаем, а значение - нет. Например, в строке параметров
a=11&b=2&c=333
надо заменить пару: b=(какое то значение) на: d=4444

как я писал выше, мой вариант /b=.*[^&]/U не проходит :(
 

Demiurg

Guest
[m]explode[/m] тебе помоежет ... сначала разделяешь по & , потом каждую пару по =
 

AntonTo

Guest
Автор оригинала: SiMM
[m]parse_str[/m]?
ага, но мне уж больно регэкспом хотелось решить... И разобраться хочу, возвращаясь к своему первому вопросу, почему:

Делаю preg_replace($pattern, $replacement, $string)

string: aa=abcde&bb=abcdef
pattern: /aa=.*[^&]/
replacement: xx=123456789

на выходе получаю
xx=123456789
вместо ожидаемых
xx=123456789&bb=abcdef

что не так? Почему в данном примере с паттерном совпала вся строка aa=abcde&bb=abcdef, хотя на мой взгляд, должна была совпасть только ее часть aa=abcde. Получается класс [^&] не сработал, почему?
 

SelenIT

IT-лунатик :)
Данный паттерн означает "aa=, затем максимально возможное количество любых символов, затем 1 символ кроме амперсанда". Вся строка прекрасно подходит под это описание.
Сравни с таким паттерном: /aa=[^&]*/
 

AntonTo

Guest
Сравни с таким паттерном: /aa=[^&]*/
Точно! Вот спасибо!
Кстати, по тестам, в моем случае код на базе preg_replace() на 20%-30% быстрее, чем код с использованием parse_str()... На одном вызове экономия около 30 микросекунд :). Наверное и не стоит оно того если вся страница за 0,1 секунды создается...
 

Demiurg

Guest
>На одном вызове экономия около 30 микросекунд
а ка ты это померял ?
 

AntonTo

Guest
ну это.... время выполнения цикла 10000 вызовов засек. Секундомером ;)
Хм, кстати preg_replace() даже на 40% быстрее выходит.
 
Сверху