代わりに、次のような正規表現を使用する必要があります。
~\{\$(\w+?)(?:\|(.+?))?\}~i
次に、コールバックに何が渡されているかを簡単に確認できます。
$str = 'This is a {$token|token was empty}';
$str = preg_replace_callback('~\{\$(\w+?)(?:\|(.+?))?\}~i', function($match) {
var_dump($match);
exit;
}, $str);
出力:
array(3) {
[0]=>
string(24) "{$token|token was empty}"
[1]=>
string(5) "token"
[2]=>
string(15) "token was empty"
}
そこから、が設定されているかどうかを確認できます。$match[1]
設定されている場合はその値を返し、そうでない場合は次を返し$match[2]
ます。
$foo = 'foo';
$str = 'Foo: {$foo|not set}, Bar: {$bar|not set}';
$str = preg_replace_callback('~\{\$(\w+?)(?:\|(.+?))?\}~i', function($match) {
if (isset($GLOBALS[$match[1]])) {
return $GLOBALS[$match[1]];
} else {
return $match[2];
}
}, $str);
var_dump($str);
出力:
string(22) "Foo: foo, Bar: not set"
注:$GLOBALS
ここでは、デモンストレーションのみを目的として使用しています。可能であれば、PHP 5.4 のクロージャ バインディングを使用することをお勧めします。これにより、クロージャに特定のオブジェクトをコンテキストとして割り当てることができます (たとえば、テンプレート/ビュー オブジェクト、または置換しようとしている変数を含むもの)。 . PHP 5.4 を使用していない場合は、構文function($match) use ($obj)
where is your context を使用して、代わりにクロージャー内$obj
をチェックすることもできます。isset($obj->{$match[1]})