У меня проблема с кодом регулярного выражения, проблема в том, что я хочу заменить все значения «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;