繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM