TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen 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()を呼び出すと、そのたびに若干のメモリーが消費されます。したがって、匿名関数を使うコールバック関数を頻繁に呼び出すアプリケーションでは、メモリー不足になる可能性があります!


前のページ     1    2    3    4    5    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.