Open Source Web Development Tutorials - Dev Shed
preg_replace_callback()関数を使いこなす!
(2009/02/05公開)
条件文のあるpreg_replace_callback()
前ページの例では、preg_replace()を使っても同じ目的を果たせるのですから、preg_replace_callback()に感動したという人はいないでしょうね。では、スクリプトを展開して、ぜひともpreg_replace_callback()関数の素晴らしさに開眼してもらいましょう。
今回は、日付をYYMMDDフォーマットではなくYYYYMMDDフォーマットで返さなくてはなりません。前ページの例の「081225」に代わって、「20081225」を返すわけです。
さらに、ここで、1つの条件を付け加えます。すなわち、YY>=’70’で1970年から1999年までの年を示し、YY<’70’で2000年から2069年までの年を示します。
したがって、"701225"は"19701225"となり、"691225"は"20691225"となります。
そんなことはpreg_match()とpreg_replace()を組み合わせれば簡単にできる、思っているのではありませんか?
しかし、上記をたった1行で実行したいと言ったらどうでしょう?できると思いますか?
では、1行バージョンを見てもらう前に、まず、「展開」バージョンをお目にかけましょう。
<?php
$pattern = '|(d{2})/(d{2})/(d{2})|';
echo preg_replace_callback($pattern, 'process', '12/25/08')."n";
echo preg_replace_callback($pattern, 'process', '12/25/70')."n";
echo preg_replace_callback($pattern, 'process', '12/25/69')."n";
echo preg_replace_callback($pattern, 'process', '12/25/98')."n";
function process($matches) {
if ($matches[3]>=70)
$prefix = '19';
else
$prefix = '20';
return $prefix.$matches[3].$matches[1].$matches[2];
}
?>
アウトプットは、以下のとおりです。
ご覧のように、置換文字列を生成するためには、あらゆる種類の処理が可能です。上記の例では、配列要素$matches[3]の年度が70より大きいか小さいかを検証しています。その結果にしたがってプレフィックスを生成し、元の置換文字列の先頭部分に追加します。
コールバック関数は、単純なif(もしも)…then(それなら)…else(でなければ)条件を使う点に注目してください。そこで、すべてを1行に凝縮することができます。
<?php
$pattern = '|(d{2})/(d{2})/(d{2})|';
echo preg_replace_callback($pattern, 'process', '12/25/08')."n";
echo preg_replace_callback($pattern, 'process', '12/25/70')."n";
echo preg_replace_callback($pattern, 'process', '12/25/69')."n";
echo preg_replace_callback($pattern, 'process', '12/25/98')."n";
function process($matches) {
return ($matches[3]>=70?'19':'20').$matches[3].$matches[1].$matches[2];
}
?>
コールバック関数は単純関数ですから、preg_replace_callback()では、create_function()を使い、匿名関数をコールバック関数として使用できます。
<?php
echo preg_replace_callback('|(d{2})/(d{2})/(d{2})|',
create_function('$matches',
'return ($matches[3]>=70?"19":"20").$matches[3].$matches[1].$matches[2];'),
'12/25/08');
?>
単一引用符を使うと、各変数に先立つ‘$’記号がそのまま残ります。二十引用符を使いたい場合は、以下のように‘$’記号をエスケープする必要があります。
<?php
echo preg_replace_callback('|(d{2})/(d{2})/(d{2})|',
create_function('$matches',
"return ($matches[3]>=70?'19':'20').$matches[3].$matches[1].$matches[2];"),
'12/25/08');
?>
ここで注意。create_function()を呼び出すと、そのたびに若干のメモリーが消費されます。したがって、匿名関数を使うコールバック関数を頻繁に呼び出すアプリケーションでは、メモリー不足になる可能性があります!
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.









