正则表达式仅在{}内部替换

时间:2011-12-25 00:22:58

标签: php regex

我想知道如果匹配在{}

之间,我怎么能用大字符串替换另一个字符?

此:

bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok

对此:

  

bla bla%bla {ok text ^^ nothing} some {%more}%text {yes ^^ no ok}   确定

请注意,{%more}未更改,因为字符和字母之间有空格。

非常感谢。

2 个答案:

答案 0 :(得分:4)

$str = 'bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok';
$str = preg_replace('/(\{[^}]*)%(\w[^}]*)/', '$1^^$2', $str);
// bla bla % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok

答案 1 :(得分:3)

如果{} 没有嵌套且在其外部不会发生},您可以执行以下操作:

preg_replace('/%(?=\w[^{]*})/', '^^', $string);

当字符串是:

bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok { %foo %bar %baz }
你会得到:

la % bla {ok text ^^nothing} some {% more} % text {yes ^^no ok} ok { ^^foo ^^bar ^^baz }

如果允许嵌套 {},您可以使用:

%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)})

作为第一个,[^{]*([^{}]*+(?:{(?1)}[^{}]*+)*+)替换,递归检查任意嵌套{}

Example

$string = '%a { %a { %a } %a { { %a } %a } } %a { % %a } %a { %a }';
echo preg_replace('/%(?=\w([^{}]*+(?:{(?1)}[^{}]*+)*+)})/', '^^', $string);

输出:

%a { ^^a { ^^a } ^^a { { ^^a } ^^a } } %a { % ^^a } %a { ^^a }