0

尝试使用 PHP 正则表达式来匹配可能是函数的单词,而不是双引号。同时忽略可能是函数的双引号中的任何内容。下面已经匹配“你好(世界)”。并将 'hello(world)' 放在一个数组中,然后将 'hello' 放在另一个数组中。但是,我想要一个不添加它的条件,如上所述。

preg_match_all('#(\w*)\s*\(.*?\)#i',$str,$m);

我试着玩它。并使用以下示例来帮助我。

(?<!a)b

虽然应用时模式结果是错误的。如果有人对此事有任何帮助,我将不胜感激。

作为当前正则表达式设计的输出。举个例子。

输入:

一($two) 二($1) 三($2one)}meme1(you2) this(that) die ("now") these function myfunc($me) empty()

输出:

array (
  0 => 
  array (
    0 => 'one($two)',
    1 => 'two($1)',
    2 => 'three($2one)',
    3 => 'meme1(you2)',
    4 => 'this(that)',
    5 => 'die (\\"meohmy\\")',
    6 => 'myfunc($me)',
    7 => 'empty()',
  ),
  1 => 
  array (
    0 => 'one',
    1 => 'two',
    2 => 'three',
    3 => 'meme1',
    4 => 'this',
    5 => 'die',
    6 => 'myfunc',
    7 => 'empty',
  ),
)

如评论中所述,您不能进行任意长度的后视。但是,您可以拥有的是任意长度的前瞻。就像 - 我认为 - 你想回顾一下“,你可以计算那些后面的人。类似于:

/(\w+)\s*\(.*?\)(?=(?:[^"]|".*?")*$)/

但是:
-确保将其应用于格式正确的代码
-如果会被转义的“愚弄”(您可以解决此问题,我没有勇气atm)
-我没有费心查看性能,因此您可以在这里做一些工作

总的来说,这可能不是一个好主意。

编辑:
它有什么作用?我拿了你的正则表达式,并在你的比赛后添加了一张支票。每次找到匹配项时,它都会检查直到字符串末尾是否有一对“”(对于大字符串来说效率极低)。

更有效的方法?当然。您无法在正则表达式中捕获未定义数量的组这一事实很麻烦。这意味着你必须遍历你的字符串。基本上,使用 preg_match 和它的所有参数(由于第 4 个参数(参见preg_match 文档)和第 5 个循环,得到匹配在 'matches' 数组中的位置),并使用如下内容:

/(?:[^"]|".*?")*?(\w+)\s*\(.*?\)/

(在我写这篇文章的时候,我认为它也不是那么有效,但对大字符串仍然更好。)
(注意:我没有测试它,因为我非常困,如果你满意的话任一解决方案,关闭问题,如果没有,我还是会回来)

4

1 回答 1

0

如评论中所述,您不能进行任意长度的后视。但是,您可以拥有的是任意长度的前瞻。就像 - 我认为 - 你想回顾一下“,你可以计算那些后面的人。类似于:

/(\w+)\s*\(.*?\)(?=(?:[^"]|".*?")*$)/

但是:
-确保将其应用于格式正确的代码
-如果会被转义的“愚弄”(您可以解决此问题,我没有勇气atm)
-我没有费心查看性能,因此您可以在这里做一些工作

总的来说,这可能不是一个好主意。

编辑:
它有什么作用?我拿了你的正则表达式,并在你的比赛后添加了一张支票。每次找到匹配项时,它都会检查直到字符串末尾是否有一对“”(对于大字符串来说效率极低)。

更有效的方法?当然。您无法在正则表达式中捕获未定义数量的组这一事实很麻烦。这意味着你必须遍历你的字符串。基本上,使用 preg_match 和它的所有参数(由于第 4 个参数(参见preg_match 文档)和第 5 个循环,得到匹配在 'matches' 数组中的位置),并使用如下内容:

/(?:[^"]|".*?")*?(\w+)\s*\(.*?\)/

(在我写这篇文章的时候,我认为它也不是那么有效,但对大字符串仍然更好。)
(注意:我没有测试它,因为我非常困,如果你满意的话任一解决方案,关闭问题,如果没有,我还是会回来)

于 2013-03-31T00:00:35.430 回答