2015-01-09 1 views
2

나는 사무실 관리 시스템을 PHP 5.3에서 5.4로 이식하고 있으며 오류는 많은 함수가 참조에 의한 전달 (인수에서 "&"기호)을 구현한다는 점과 그러면 응용 프로그램 런타임이 중지됩니다. 나는 다음과 같은 방식으로 해결했다 :PHP 통화 시간에 의한 참조 전달 정규 표현식으로 대체

//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 개가 넘는 파일이 하나씩 하나씩 교체해야합니다.

그래서 난 그냥 (함수 선언에서 "& $"우연의 일치와 의미 & &을 방지하고)는 나에게이 모든 "& $"우연의 일치를 찾을 수 있습니다 정규식이 필요합니다.

[^ &] & \ $이 정규 표현식을 만들었지 만 작동하지만 "함수"에서 행을 시작하는 우연의 일치를 제외해야합니다 (함수 선언).

답변

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

시도해보십시오.이 작업은 사용자에게 적합합니다. $1으로 바꾸십시오.

데모보기 (3)을 대체 할 0 폭 assertions.It를 사용하지 않는

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

귀하의 정규식 [^&]&\$는 lookaheads 및 lookbehnids를 사용하는 것이 좋습니다 characters.So.

$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); 
+0

거의 완벽하지만 기능 선언도 우연의 일치로 간주됩니다. 나는 그 라인에서 "&"를 바꾸지 않아야한다. "기능"단어가 줄의 시작 부분에 없다는 것을 검증 할 필요가 있습니다. 어떻게 그 검증을 (?

+0

@CarlosAntidioMorales try now.edited – vks

+0

이 줄은 다음과 같습니다. function load_se ($ sis, $ ven, & $ pe, & $ seg, & $ per) –

관련 문제