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

时间:2011-04-29 20:56:58

标签: php regex preg-match-all

示例文字

this text will be left alone ##{class1}{arg1;arg2;arg3}## some other text and
another thingie ##{Class2}{]##

目前我正在使用此'/\#\#\{(?P<class>.+)\}\{(?P<args>.+)\}\#\#/i'来匹配它,但我的问题是,当此正则表达式多次出现时,因为它甚至会匹配两个匹配模式之间的文本。

这是我的正则表达式##{ClassName1}{arg1;arg2;arg3}## some other random ##{class2}{}##的结果。

是否有更优雅的方法从字符串中提取##{class1}{arg1;arg2;arg3}####{Class2}{]##并将其替换为相应类的输出?

我正在使用它来替换Class1和Class2的输出,其中参数介于第二组{}

之间

注意:如果第二组{}为空,则意味着没有参数传递给第一组{}

中具有名称的类

1 个答案:

答案 0 :(得分:5)

问题在于.+是“贪婪的” - 只要模式的其余部分仍可以解析,它将消耗它可能的每个角色。

脏的通用解决方案是执行.+?,它将匹配满足模式其余部分所需的最少字符,并且在这种情况下可以正常工作。

但一般来说,最好还是写一些比.+更具体的东西。在你的情况下,[^}]+会工作吗?也就是说,在{}符号之间,您可以包含任意数量的不是结束{0}}的字符。