Я портирую офисную систему управления с 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 файлов, и мне пришлось бы заменить один за другим, построчно.
Так что мне просто нужно регулярное выражение, которое поможет мне найти все это «&$ «совпадения (избегая && что означает И, и любой из «&$ «совпадений в объявлении функции).
Я построил это регулярное выражение: [^&]&\ $ и это работает, но нужно исключить любое совпадение, начинающее строку в «функции» (это будет объявление функции).
^(\s*function.*)$|(?<!&)&(?=\$[^(]*\))
Попробуйте это. Это должно работать для вас. $1
,
Смотрите демо.
https://regex101.com/r/sH8aR8/35
Ваше регулярное выражение [^&]&\$
не использует 0 утверждений ширины. Он заменит 3 символа. Так что лучше использовать lookaheads и lookbehnids.
$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);
Других решений пока нет …