替换()之间的所有“foo”

时间:2011-04-22 13:33:06

标签: php regex

我的正则表达式代码有问题,问题是:我想要替换所有“foo”值,但仅在“()”内。例如:

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

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

3 个答案:

答案 0 :(得分:7)

假设括号“有效”,您可以替换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

答案 1 :(得分:1)

这会在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])后面的字符串。

答案 2 :(得分:0)

如果您可以使用循环并多次替换,则此解决方案将起作用:

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