регулярка - замена в строке

pitbuly

Новичок
регулярка - замена в строке

Помогите никак не получается.
есть строка - как бы не так,что (ты!,вы!),ничуть не бывало,(никак,вовсе) нет,(куда,где,какое) там!,да (ты,вы) что!

вроде элементарная задача мне нужно заменить , на * , но только если они находяться внутри ковычек.


Я делал так
preg_replace('/\(.+(,?).+\)/Ui','*',$my_string);
выход - а вот и нет|как бы не так,что *,ничуть не бывало,* нет,* там!,да * что!

И так
ereg_replace('\(.+(,).+\)','*',$rsin);
выход - а вот и нет|как бы не так,что * что!
 

dimagolov

Новичок
pitbuly, ты не замечешь, что заменяется весь шаблон? это ни на какие мысли не наводит?
 

pitbuly

Новичок
Дак в том то и дело, как описать что надо только внутри ( ) , я бамбук в регулярках. помогите плиз
 

freeek

Новичок
я че то вообще не догнал о чем речь

надо заменить содержимое () на *
т.е. например (никак,вовсе) на (*) или на *


preg_replace('/\(.+(,?).+\)/Ui','(*)',$my_string);
preg_replace('/\(.+(,?).+\)/Ui','*',$my_string);


или что надо?
 

pitbuly

Новичок
этот вариант близок - preg_replace('/\(.+(,?).+\)/Ui','*',$my_string);
выводит - а вот и нет|как бы не так,что (*),ничуть не бывало,(*) нет,(*) там!,да (*) что!

а мне нужно -
как бы не так,что (ты!*вы!),ничуть не бывало,(никак*вовсе) нет,(куда*где*какое) там!,да (ты*вы) что!
 

freeek

Новичок
ааа
ну щас поглядим

-~{}~ 31.08.09 22:10:

типа такого в голову пришло

$str = 'как бы не так,что (ты!,вы!),ничуть не бывало,(никак,вовсе) нет,(куда,где,какое) там!,да (ты,вы) что!';
function replace($m)
{
return str_replace(',','*',$m[0]);
}
$d = preg_replace_callback('%\([\w\W]+\)%Ui', replace, $str);
echo '<pre>';
print_r($d);
exit();
 

nerezus

Вселенский отказник
pitbuly
> я бамбук в регулярках. помогите плиз

Нет проблем:
http://php.net/manual/en/reference.pcre.pattern.syntax.php
 

Mironor

Новичок
Автор оригинала: zerkms
ну и жесть...... нафига "?" ??
Ну это, как бы, хорошая привычка при которой ты будешь точно уверен в том, что получишь (хотя можно и модификатор U использовать, да...)

А для второй скобки я был немного неправ... (хотя на результат это повлияло мало)
 

freeek

Новичок
Автор оригинала: Mironor
А может так?
PHP:
echo preg_replace("/\(([^,]+?),([^,]+?)\)/i", '(\\1*\\2)', 'PROGRAMMING (sds,sd) sdq (sdq,ze) is.');
че то я не совсем понял, это откуда такой синтаксис?
у меня лично возвращает 'PROGRAMMING (sds,sd) sdq (sdq,ze) is.', эо впринципе логично такак поиск мы существляем именно в 'PROGRAMMING (sds,sd) sdq (sdq,ze) is.' изходя из того что есть

поясни пожалуйста.

используя функцию обратного вызова мы избегаем головной боли по кол-ву запятых внутри круглых скобок
так как сама регулярка заменит всю патерну
 

Mironor

Новичок
Перед запятой идет \(([^,]+?), что означает что идет скобка и минимальное (из-за знака ?) кол-во любых символов кроме запятой до первой встречи с запятой. После запятой корректнее поставить ([^)]+?)\), т.е. минимальное кол-во любых символов кроме скобки до первой скобки.
Второй аргумент выводит "(полученное регулярным выражением в первой группе скобке)*(полученное во второй группе скобок)".
А третий аргумент ты можешь заменить любой строкой.
Знак вопроса после + можно и не ставить, но он, в принципе и не мешает ^^

echo preg_replace("/\(([^,]+),([^)]+)\)/i", '(\\1*\\2)', 'PROGRAMMING, (sds,sd) sdq (sdq,ze) is '); // выводит PROGRAMMING, (sds*sd) sdq (sdq*ze) is
 

freeek

Новичок
все понял
насчет патерны и реплейса все понятно

меня смутило 'PROGRAMMING, (sds,sd) sdq (sdq,ze) is '
подумал какая то установка неизвестная )))))))

все верно, твоя рега работает
проблема в том что она не решает вопроса который поставил топикстартер

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

pitbuly

Новичок
freeek - Да это то что надо.
А то я думаю чо так не работает?
preg_replace('/\(.+(,?).+\)/Ui',str_replace(',','*',"$0"),$my_string);
 
Сверху