我在stackerflow上找到了以下答案,其中描述了如何使用正则表达式模式从字符串中提取(嵌套)函数和参数。
用户还提供了一个模式应该工作的示例,在他从最外部的函数中提取参数(在php中也可以很好地工作)后,他匹配以下文本
a,b,func1(a,b+c),func2(a*b,func3(a+b,c)),func4(e)+func5(f),func6(func7(g,h)+func8(i,(a)=>a+2)),g+2
具有以下模式
(?:[^,()]+((?:'((?>[^()]+|'((?<open>)|')(?<-open>))*(?(open)(?!))')))*)+
下面的(更简单的)模式也应该适用于
(?:[^,()]+((?:'((?>[^()]+|'((?<open>)|')(?<-open>))*')))*)+
注意,用户使用C#作为他的例子,我想让它在PHP中工作,但我无法做到
因此,当我尝试使用preg_match($pattern, $string, $matches)
匹配示例String时,它不会返回任何匹配项。
如果我在regex101上输入模式和示例,它会给我错误,我无法修复它们(我想这与模式的<open>
部分有关)。
我在regex方面不是最好的,所以有人能帮我,告诉我我需要改变什么模式才能使用php吗?
PHP使用PCRE正则表达式引擎来实现其preg_*
函数。PCRE可以使用递归匹配嵌套模式,而.NET则使用不同的方法:平衡组。这两种口味之间还有其他主要区别。
因此,您想要实现的目标肯定是可能的,但需要完全重写regex,因为这两种方法完全不同。
以下是PCRE(带gx
)的翻译:
(?:
[^,()]++ # match a function name
(?<args> # open the "args" group
'( # opening parenthesis
(?:
[^()]++ # match anything but parentheses
| 'g<args> # or recurse into "args", make sure the parentheses are balanced
)*+
') # closing parenthesis
)*+
)+
演示
或者,以较短的形式:
(?:[^,()]++(?<args>'((?:[^()]++|'g<args>)*+'))*+)+