[英]Regular expression replace only if inside { }
我想知道如何将字符替换为大字符串中的另一个字符,前提是匹配项位于{}之间
这个:
bla bla % bla {ok text %nothing} some {% more} % text {yes %no ok} ok
对此:
bla bla%bla {ok text ^^ nothing}一些{%more}%text {yes ^^ no ok} ok
请注意,{%more}未被更改,因为字符和字母之间存在空格。
非常感谢您。
$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
如果{}
没有嵌套,并且在它们之外也不能出现}
,则可以执行以下操作:
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 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.