我正在编写一个脚本,用于循环PHP文件并在必要时重命名函数调用。此选择需要通过以下规则来完成:
目前我有以下正则表达式:
preg_replace_callback("/((?<=function\s|\:\:|->)[a-z][a-zA-Z0-9\_]+)\(.*\)/i", 'test', $content);
这是断言背后的正面看法:它给出了按NO分类的所有给定规则:)
所以我必须以消极的方式改变它,但那是我的问题。当我尝试时,它不像提议的那样工作。
修改
当我尝试断言后面的负面看法
'?<!' instead of '?<='
通过上面的例子,它给出了以下输出:
它删除了我不想匹配的函数的第一个字母。有没有人知道如何做到这一点?
答案 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);