2011-07-30 8 views
0

preg_replace_callback을 사용할 때 문제가 있습니다. 나는 구글 번역기 클래스 이 있고 그것을 사용하여 모든 경기를 번역하고 싶습니다.preg_replace_callback을 사용할 때의 문제점

코드입니다. 내가 var에 $ 코드 VAR 덤프를 할 때

$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$matches', 
'return $translator->translate($matches);'), 
$code); 

, 내가 그 문자열 "1"을 발견!

메신저가 올바른 방법을 사용하고 있는지 확인하십시오.

감사합니다.

+0

'translate()'메소드가 필요합니다. 하나의 매개 변수 ('$ matches' 배열) 만 가져 와서 문자열을 반환해야합니다. – ridgerunner

+0

시도해보기 위해'global $ translator;'줄을 추가해보십시오. –

+0

Google 번역은 올해 비즈니스가 중단되며, 여러분은 그것에 의존해서는 안됩니다. –

답변

2

여기서 문제는 범위입니다. 이와 비슷한 것은 JavaScript에서 작동하지만 JS와 PHP는 범위를 다르게 처리합니다. 익명 함수의 범위에서 에 액세스하려면 전역 함수로 선언해야합니다. 나중에 PHP 5.3.0 이상을 사용한다면

<?php 
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/', 
      create_function('$matches', 
       "return $GLOBALS['translator']->translate($matches);"), 
      $code); 
?> 

, 이것은 폐쇄로 완화 할 수있다 : 당신이 한 라이너로 익명을 유지하려면

<?php 
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/', 
      create_function('$matches', 
       'global $translator;'. 
       'return $translator->translate($matches);'), 
      $code); 
?> 

, 당신은 전역 배열을 사용할 수 있습니다 및 use :이 $code가 동일한 범위에서 생성되었다고 가정한다

<?php 
$code = preg_replace_callback('/_e\(\'(.*?)\'\)/', 
      function($matches) use ($translator) { 
       return $translator->translate($matches); 
      }, $code); 
?> 

.

+0

아마도 가장 좋은 것은 그가'Translator :: tranaslate ($ matches);'로 액세스 할 수 있도록 정적 함수를 만드는 것입니다. 따라서 전역 함수를 피할 수 있습니다. –

+0

이것은 내가 방금 온 것입니다. –

+0

대안은 익명 호출 함수 대신 별도의 콜백 함수를 사용하는 것입니다. –

1

$ translator도 인수로 전달하십시오.

$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$translator,$matches', 
'return $translator->translate($matches);'), 
$code); 

업데이트 :이 코드 예제는 작동하지 않습니다

이처럼 보일 수 있습니다. replace 콜백은 하나의 인수 만 사용하여 호출되며 anonymous 함수는 여기에 2 개의 인수가 필요합니다. 작업의 구현은 다음과 같습니다

$code = preg_replace_callback('/_e\(\'(.*?)\'\)/',create_function(
'$matches', 
'global $translator; return $translator->translate($matches);'), 
$code); 
+0

개체를 콜백으로 전달할 수 없습니다. 콜백은 함수 여야합니다. –

+0

익명 함수에 인수로 $ translator를 전달하려고했습니다. 내 게시물을 업데이트하여 코드를 표시합니다. –

+0

이것은'$ translator '의 범위에 대한 문제를 다루지 만 정확하게 그렇게하지는 않습니다. preg_replace_callback은 콜백을 호출하기 때문에 matches 배열에서 먼저 전달됩니다 (하나의 매개 변수 만 필요함). –

1

PHP 5.3에서는 클로저를 사용할 수 있습니다.

<?php 
$code = preg_replace_callback(
    '/_e\(\'(.*?)\'\)/', 
    function($matches) use ($translator) { 
     return $translator->translate($matches); 
    }, 
    $code 
); 
+0

그리고 PHP 5.4에서는 클로저가 인스턴스 변수를 다시 사용할 수 있습니다 ... 기다리는 중입니다. – Smar

+0

완벽한, 감사합니다. – Programmer4me

관련 문제