Php 正则表达式仅在{}内替换
我想知道,只有在{}之间匹配时,如何才能用大字符串中的另一个字符替换一个字符 这: 为此: blabla bla%bla{ok text^^ nothing}一些{%more}%text{yes^^ no ok} 嗯 注意,{%more}没有更改,因为字符和字母之间有空格Php 正则表达式仅在{}内替换,php,regex,Php,Regex,我想知道,只有在{}之间匹配时,如何才能用大字符串中的另一个字符替换一个字符 这: 为此: blabla bla%bla{ok text^^ nothing}一些{%more}%text{yes^^ no ok} 嗯 注意,{%more}没有更改,因为字符和字母之间有空格 非常感谢您的支持。如果{}没有嵌套并且在它们之外不会出现任何},您可以执行以下操作: $str = 'bla bla % bla {ok text %nothing} some {% more} % text {yes %no
非常感谢您的支持。如果
{}
没有嵌套并且在它们之外不会出现任何}
,您可以执行以下操作:
$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}[^{}]*+)*+)
,递归检查任意嵌套的{}
:
输出:
%a { ^^a { ^^a } ^^a { { ^^a } ^^a } } %a { % ^^a } %a { ^^a }
如果大括号是嵌套的怎么办?这个答案不那么复杂,效果更好。很好地使用了前瞻。我很好奇:
[^{]
为什么有必要?@Tobi,我所做的只是检查当前%\w
后面是否有一个
而没有任何打开{
介于两者之间,因此我们在{}
内。谢谢,这是迄今为止我得到的最好答案。
$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 }