0

私は次のコードを試みました:

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];');
$result = preg_replace_callback( $regex, '$for_callback', $string);

変数$GLOBALS['replacements']は、この関数が呼び出される前に動的に生成されます。

次のようなエラーメッセージが表示されます

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, '$for_callback', to be a valid callback in...

作成された関数とコールバックは、どちらも私にとって新しいものです。これは、 に変わったpreg_replace についての私の質問で nickb によって私に与えられたコードから成長していpreg_replace_callbackます。

私がやろうとしているのは、その回答のコードを関数にラップすることです。関数の再定義を回避するスコープでエラーが発生しています。(現時点では、PHP 5.3+ へのアップグレードは、私にとって可能性のあるオプションです。)

これを機能させるにはどうすればよいですか?

4

1 に答える 1

1

まず、変数は実際の値に置き換えられないため、単一引用符で囲んではなりません。

次に、匿名関数 (つまりクロージャ) を代わりに使用する方がはるかに簡単です。次の例のように使用します。

$for_callback = function($match) {
    return $GLOBALS['replacements'][$match[1]];
};
$result = preg_replace_callback( $regex, $for_callback, $string);

編集: クロージャは PHP 5.3 で利用可能になりました。したがって、まだ PHP < 5.3 を使用している場合は、(実際に更新するか) 以下を使用する必要があります。

$for_callback=create_function('$match','return $GLOBALS[\'replacements\'][$match[1]];');
$result = preg_replace_callback( $regex, $for_callback, $string);
于 2013-07-11T16:06:08.693 に答える