Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式仅在{}内替换_Php_Regex - Fatal编程技术网

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

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

我想知道,只有在{}之间匹配时,如何才能用大字符串中的另一个字符替换一个字符

这:

为此:

blabla bla%bla{ok text^^ nothing}一些{%more}%text{yes^^ no 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}[^{}]*+)*+)
,递归检查任意嵌套的
{}

:

输出:

%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 }