匹配函数调用列表中的第一个函数

时间:2011-03-28 21:02:39

标签: php regex

已回答从阅读我能做的事情来看,这似乎在正则表达式中几乎无法做到,所以我正在使用正则表达式来匹配函数模式,然后使用大括号对结果进行标记位置。不是最好的答案,但也解决了。

我正在尝试匹配函数列表中的第一个单个函数,例如

$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,它可以解释参数和表达式。它在除了多个隐藏功能之外的所有功能上都很棒。

3 个答案:

答案 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'