2011-07-30 18 views
0

私はpreg_replace_callbackを使用すると問題があります。私はグーグル翻訳者のクラス を持っていると私はそれを使用してすべての一致を翻訳したい。preg_replace_callbackの使用に関する問題

コードがありました。私は、変数$コードのためのVaRのダンプを行うとき

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

は、私は、その文字列を発見した "1" !!!

私はクラスに正しい方法を使用していることを確認します。

ありがとうございました。

+0

'translate()'メソッドが必要です。これは1つのパラメータ( '$ matches'配列)だけをとり、文字列を返さなければなりません。 – ridgerunner

+0

'global $ translator;'行を試してみてください。 –

+0

Google翻訳は今年中に廃止される予定です。 –

答えて

2

問題はここにあります。これに似たものがJavaScriptでは動作しますが、JSとPHPではスコープが異なって処理されます。匿名関数のスコープ内からにアクセスするには、グローバルとして宣言する必要があります。

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

あなたはワンライナーとしてアノンを維持したい場合は、グローバル配列を使用することができます:あなたは、後でPHP 5.3.0以上をお持ちの場合

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

が、これは閉鎖して軽減することができますそしてuse

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

これはは$codeと同じスコープ内に作成されたと仮定されます。

+0

おそらく最も良いことは静的関数を作成して 'Translator :: tranaslate($ matches);'でアクセスできるようにすることです。つまり、グローバルには避けてください... –

+0

これは私が今来たものです。 –

+0

代わりに、匿名のコールバック関数の代わりに別のコールバック関数を使用することもできます。 –

1

引数として$ translatorも渡すようにしてください。

これは次のようになります。

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

UPDATE:このコード例が動作しません。置換コールバックは1つの引数のみで呼び出されますが、ここでは無名関数は2つの引数を必要とします。作業実装は次のようになります。

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

オブジェクトをコールバックとして渡すことはできません。コールバックは関数でなければなりません。 –

+0

私は無名関数の引数として$ translatorを渡すつもりでした。コードを表示するために投稿を更新します。 –

+0

これは '$ translator 'の範囲の問題に対処しますが、正しくは行いません。 preg_replace_callbackはコールバックを呼び出すため、match配列内を最初に渡します(そして、1つのパラメータだけが必要です)。 –

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