我的正则表达式代码有问题,问题是:我想要替换所有“foo”值,但仅在“()”内。例如:
try foo foo-foo (try foo inside , foo foo foofoo)
我想用“boo”替换括号之间的所有“foo”字符串。
答案 0 :(得分:7)
假设括号“有效”,您可以替换foo
之后的所有)
,而不是(
:
$str = preg_replace('/foo(?=[^()]*\))/', 'bar', $str);
另一个选项,也假设没有嵌套对,是匹配"(...)"
标记并使用回调,但它可能过度使用:
回调方法:
function replace_foo($matches) {
return str_replace('foo', 'bar', $matches[0]);
}
使用:
$str = preg_replace_callback("/\([^()]*\)/","replace_foo", $str);
答案 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;