PHP正则表达式负面看断断言,preg_replace_callback

时间:2012-03-28 09:22:20

标签: php regex

我正在编写一个脚本,用于循环PHP文件并在必要时重命名函数调用。此选择需要通过以下规则来完成:

  • 没有函数声明//函数test(){
  • 没有静态函数// SomeClass :: staticMethod()
  • NO class functions // $ class-> method()
  • 仅限函数调用// myFunction()

目前我有以下正则表达式:

preg_replace_callback("/((?<=function\s|\:\:|->)[a-z][a-zA-Z0-9\_]+)\(.*\)/i", 'test', $content);
  • 函数名称大多以camelBack表示法编写。
  • 有时函数名称包含下划线。

这是断言背后的正面看法:它给出了按NO分类的所有给定规则:)

所以我必须以消极的方式改变它,但那是我的问题。当我尝试时,它不像提议的那样工作。

修改

当我尝试断言后面的负面看法

  

'?<!' instead of '?<='

通过上面的例子,它给出了以下输出:

  • est()(首先缺席)
  • taticMethod()(首先丢失)
  • ethod()(首先缺失)
  • myFunction()(正确)

它删除了我不想匹配的函数的第一个字母。有没有人知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

你好像错了一个括号。您当前的正则表达式似乎删除了camelcase函数的第一个字符。这看起来效果更好(使用preg_match_all测试):

preg_match_all("/(?<=function\s|\:\:|->)([a-z][a-zA-Z0-9\_]+)\(.*\)/i", $file, $matches);

另一方面,你使用preg_replace_callback是不正确的,因为它的第二个参数应该是callable

修改

根据PO的评论,我的第一次尝试是愚蠢的:)

你的表达式的主要问题是,如果它以::开头,它将删除此部分,但方法名称的第一个字母将与您的第一个子表达式匹配,其余部分将作为方法匹配名。

我尝试了另一个角色组的approch,让我知道它是如何为你工作的:

preg_match_all('/[^:a-z]([a-z]+[a-zA-Z0-9\_]+)\(.*\)[^\s{]/i', $file, $matches);