Php 获取所有出现的字符串并替换它们

Php 获取所有出现的字符串并替换它们,php,regex,preg-match-all,Php,Regex,Preg Match All,示例文本 this text will be left alone ##{class1}{arg1;arg2;arg3}## some other text and another thingie ##{Class2}{]## 目前,我正在使用这个'/\\\\\\\\\\\\\{(?p.+)\\\\\\{p.+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/i'来匹配它,但我的问题是当这个正则表达式出现多次时,因为它甚至会匹配两个匹配模式之间的文

示例文本

this text will be left alone ##{class1}{arg1;arg2;arg3}## some other text and
another thingie ##{Class2}{]##
目前,我正在使用这个
'/\\\\\\\\\\\\\{(?p.+)\\\\\\{p.+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/i'
来匹配它,但我的问题是当这个正则表达式出现多次时,因为它甚至会匹配两个匹配模式之间的文本

这是我的正则表达式的结果

有没有更优雅的方法从字符串中提取
{class1}{arg1;arg2;arg3}{code>和
{Class2}{]{/code>,并用共同响应类的输出替换它们

我用它来替换它们,用第二组
{}



注意:如果第二组{}是空的,这意味着没有参数被传递给第一组{}

中名为的类,问题是
+
是“贪婪的”—只要模式的其余部分仍然可以解析,它将尽可能地使用所有字符

脏的通用解决方案是执行
+?
,这将匹配满足模式其余部分所需的最少字符,并且在这种情况下有效


但是一般来说,写一些比
+
更具体的东西更好。在你的情况下,
[^}]+
会起作用吗?也就是说,在
{
}
符号之间,可以有任意数量的非结束字符
}

问题在于
+
是“贪婪的”-只要模式的其余部分仍然可以解析,它将尽可能地消耗所有字符

脏的通用解决方案是执行
+?
,这将匹配满足模式其余部分所需的最少字符,并且在这种情况下有效


但通常情况下,编写比
+
更具体的内容更可取。在您的情况下,
[^}]+
会起作用吗?也就是说,在
{
}
符号之间,可以有任意数量的字符,这些字符不是结束符
}

和后续注意事项,如果您想在第二个参数列表中不允许任何字符,则需要使用
[^}]*
而不是
[^}]+
。因此我提出了这个
/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(?p\+?[\\\\}]*)(?P\{.+?[\}]*)\\\\\\\\\\\\/i
它匹配我所需要的一切,但是
包含
{class1}
。但是这只是一个小问题。但是如果匹配
{/code>和
[\}]*
(?P\{.+?[\}]*])
之外,如果匹配
{code>,我会得到
string…该死的这些regexp…我想我永远都不会完全理解它们,还有一个注释…我不得不使用。+?在##{}的第二部分中##因为您几乎可以将任何内容作为参数传递给类…但是我用
\w+?
替换了类名,并且有一个后续说明,如果您想在第二个参数列表中不允许任何字符,则需要使用
[^}]*
而不是
[^}]+
。因此我提出了这个
/\\\\\\\\\\\\\\\\\(
它匹配我所需要的一切,但是
包含
{class1}
例如。但这只是一个小问题。但是如果将
{
[\}]*
移动到
之外(?P\{.+?[\}]*)
如果匹配
{},则会给我
string…该死的这些regexp…我想我永远都不会完全理解它们,还有一个注意事项…我不得不使用。++?在#{}{}{}###的第二部分中,因为你可以将几乎任何东西作为参数传递给类…但是我用
\w+?