正则表达式找到被调用的所有函数

时间:2013-02-26 02:19:23

标签: php regex parsing preg-match-all

我正在尝试构建一个正则表达式来查找字符串中的所有函数调用。例如:

 No No       No       No         Yes       Yes        No DOT YES   NO    YES
 |  |        |        |           |         |         |   |   |     |      |
(1, 2, 3 * (1/4), 'somestr()', findme(), andme ( ), 'and' . me(), NTME, me(0) )

   No        No          No
   |         |           |
(CONST, 'some"q()', "nop\"no()")

字符串将始终采用参数列表的格式eq => (a,b,c...)

请注意,对于'and' . me(),它只应与me()部分

匹配

到目前为止,我可以使用this创建一个匹配内部引号的正则表达式:

'/' . 
    '(?:\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')' .      // single quoted string
        '|' .                                       //   or
    '(?:"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")' .          // double quoted string
'/s';

我需要的是一个正则表达式,它将匹配上述正则表达式\w\s*\(

的任何内容

澄清我正在尝试匹配任何上面带有“是”的内容

我将如何编写这样的正则表达式?

1 个答案:

答案 0 :(得分:2)

我同意上面关于tokenizer的评论,但是你可以通过正则表达式实现这一目标。

首先,php允许外观,所以你可以只匹配之前没有 a'或“:

\w\s*\(
(?<!["'])\b\w+\s*\(

(参见interactive regexr here

(?<!["'])表示“前面没有"'”。 \b意味着我们应该匹配整个函数名称,而不是从中间开始。

要将此转换为php语法,我认为你加倍反斜杠(额外的反斜杠 - 逃避总是让我感到困惑):

'/(?<!["\'])\\b(\\w+)\\s*\\(/s'

另请注意,由于\w[0-9a-zA-Z_],因此会匹配2()。它也会匹配引号内的no中的"asdf no()",因为'之前没有"no

在这种情况下,你可以另外指定在结束括号后没有引号,如下所示:

(?<!["'])\b\w+\s*\([^)]+\)(?!'")

其中(?!'")表示“未跟'"”。

这引入了一组新问题,例如,如果函数调用中包含嵌套括号(matchme('(asdf)')不匹配)。您可以继续调整和调整正则表达式,例如这些情况,但总会有一些东西会破坏正则表达式,最后,更容易使用标记器或解析器