замените все «foo» между ()

У меня проблема с кодом регулярного выражения, проблема в том, что я хочу заменить все значения «foo», но только внутри «()». Пример:

try foo foo-foo (try foo inside , foo foo foofoo) 

Я хочу заменить все строки «foo» между круглыми скобками «boo».

Предполагая, что круглые скобки «действительны», вы можете заменить все foo s, за которыми следуют ) , без ( в промежутке:

 $str = preg_replace('/foo(?=[^()]*\))/', 'bar', $str); 

Рабочий пример: http://ideone.com/xezU7

Другой вариант, также не предполагающий никаких вложенных пар, заключается в том, чтобы сопоставить "(...)" токены и использовать обратный вызов, но может быть использовано чрезмерное усилие:

Метод обратного вызова:

 function replace_foo($matches) { return str_replace('foo', 'bar', $matches[0]); } 

использовать:

 $str = preg_replace_callback("/\([^()]*\)/","replace_foo", $str); 

Рабочий пример: http://ideone.com/ZzBem

Это находит все вхождения foo внутри () и заменяет их str_replace . По моему опыту могу сказать, что это быстрее, чем preg_replace .

 while (preg_match_all('/^(.*)(\([^\)]*foo[^\)]*\))(.*)$/', $string, $pat)) { $string = $pat[1] . str_replace('foo', 'boo', $pat[2]) . $pat[3]; } 

Обратите внимание на три группы: строка перед ( ( $pat[1] ), строка в () которая содержит foo ( $pat[2] ) и строку за ней ) ( $pat[3] ).

Если вы можете жить с использованием цикла и заменять несколько раз, это решение будет работать:

 do { $string = preg_replace('/(\([^)]*)foo([^)]*\))/U', '\1boo\2', $string, -1, $count); }while($count != 0); echo $string;