替换所有的"foo"()之间


replace all "foo" between ()

我有问题与我的正则表达式代码,问题是:我想取代所有的"foo"值,但只有内部"()"。例子:

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

我想用"boo"替换括号之间的所有"foo"字符串。

假设括号是"有效的",您可以替换后面跟着)的所有foo,中间没有(:

$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;