已回答从阅读我能做的事情来看,这似乎在正则表达式中几乎无法做到,所以我正在使用正则表达式来匹配函数模式,然后使用大括号对结果进行标记位置。不是最好的答案,但也解决了。
我正在尝试匹配函数列表中的第一个单个函数,例如
$string = "user('firstname'), user('lastname')"
但我不知道如何成功模式匹配一个可能包含任何类型参数的子函数调用,即一个字符串,如“my string)”,例如
$string = "user('my string)!'), user('lastname')"
因此任何模式都不能匹配其中的任何大括号,即 user('my string)。
我不关心匹配不同类型的参数,而只是将第一个函数作为一个整体来抓取。目前的正则表达式如下。
'/([a-z0-9\_]+)\((.*)\)/'
我会想象某种负面的前瞻/后方断言是必需的,但我还没有达到构建模式的那个水平。任何帮助将不胜感激。
正则表达式的味道是PHP。
编辑1 功能列表也可能如下所示。
user((5*5)+10), user(otherfunc())
在这种情况下,模式必须匹配用户((5 * 5)+10)然后匹配后处理用户(otherfunc())。我有一个表达式tokeniser,它可以解释参数和表达式。它在除了多个隐藏功能之外的所有功能上都很棒。
答案 0 :(得分:1)
尝试:
(?:\s*([a-z\d_]+)\('[^']+'\)),?
这也将匹配任意数量的函数(具有全局匹配/ g标志),即:。
user('firstname'), user('lastname'),user3('la!(["())!gstname')
编辑:对于您尝试执行的操作,这不适合正则表达式,因为您正在处理嵌套结构,即递归。最好不要单独循环遍历每个字符,并以与真实语言相同的方式解析它。
答案 1 :(得分:0)
我认为'/([a-z0-9\_]+)\(\'([^\']*)\'\)/'
应该可以。至少,如果参数始终是单引号内的字符串。这是你需要的还是必须更先进的?
答案 2 :(得分:0)
'~^[a-z0-9_]++\(([^\'"()]*+(?:(?:\'[^\'\\\\]*+(?:\\\\.[^\'\\\\]*+)\'|"[^"\\\\]*+(?:\\\\.[^"\\\\]*+)"|\((?1)\))[^\'"()]*+)*+)\)~'
没试过。
稍微更具可读性:
'~^
[a-z0-9_]++
\((
[^\'"()]*+(?:(?:
\'[^\'\\\\]*+(?:\\\\.[^\'\\\\]*+)\'
| "[^"\\\\]*+(?:\\\\.[^"\\\\]*+)"
| \((?1)\)
)[^\'"()]*+)*+
)\)
~x'