我想知道如果匹配在{}
之间,我怎么能用大字符串替换另一个字符?此:
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}未更改,因为字符和字母之间有空格。
非常感谢。
答案 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)}[^{}]*+)*+)
替换,递归检查任意嵌套{}
。
$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 }