PHP 调用时按引用传递替换为正则表达式


PHP Call-time pass-by-reference replace with regex

我正在将办公室管理系统从 php 5.3 移植到 5.4,错误包括许多函数实现按引用传递(参数中的"&"符号),这会停止应用程序运行时。我通过以下方式解决了:

//This is a function with pass by reference:
function myfunc(&$x, $y, &$z) { ... }
//This is the above function being implemented:
$myClass->myfunc(&$var1, $var2, &$var3);

php 文档告诉我,当我实现函数时,我必须删除"&",所以我必须将该行替换为:

$myClass->myfunc($var1, $var2, $var3);

因为函数定义已经具有符号,这意味着参数来自引用。

但是我有很多php文件,超过800个文件,我必须逐行替换一个。

所以我只需要一个正则表达式来帮助我找到所有这些"&$"重合(避免 &&&这意味着 AND,以及函数声明中的任何"&$"重合)。

我构建了这个正则表达式:[^&]&''$,它可以工作,但需要排除在"函数"中以该行开头的任何巧合(它将是一个函数声明)。

^('s*function.*)$|(?<!&)&(?='$[^(]*'))

试试这个。这应该适合您。替换为 $1

请参阅演示。

https://regex101.com/r/sH8aR8/35

您的正则表达式[^&]&'$不使用 0 宽度断言。它将替换 3 个字符。因此,最好使用前瞻和外观

$re = "/^(''s*function.*)$|(?<!&)&(?=''$[^(]*''))/im";
$str = "&'$)'n&&'$'n'$myClass->myfunc(&'$var1, '$var2, &'$var3);'nfunction myfunc(&'$x, '$y, &'$z) { ... }'n'n";
$subst = "$1";
$result = preg_replace($re, $subst, $str);