我有问题与我的正则表达式代码,问题是:我想取代所有的"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;