Open Source Web Development Tutorials - Dev Shed
preg_replace_callback()関数を使いこなす!
(2009/02/05公開)
PHPのpreg_replace_callback()関数
preg_replace_callback()関数はドキュメントも少なく、十分に活用されていないPHP関数ですが、多くの状況で-特に、preg_match()やpreg_replace()を頻繁に利用している場合-役に立ってくれる頼もしい関数です。今回は、preg_replace_callback()関数の利用方法を理解してもらうため、分かりやすい例を挙げながら、この関数の行動を説明していきましょう。
preg_replace() とpreg_replace_callback()
preg_replace_callback()関数を理解する一番良い方法は、preg_replace()関数と比較してみることです。
以下は、preg_replace()関数を使って作成したスクリプト例です。単純に、日付のフォーマットをMMDDYYからYYMMDDに変換します。
<?php
$string = '12/25/08';
$pattern = '|(d{2})/(d{2})/(d{2})|';
$replacement = '$3$1$2';
echo preg_replace($pattern, $replacement, $string);
?>
このスクリプトのアウトプットは以下のとおりです。
さて、2番目の例として、preg_replace_callback()関数を使って同じ変換を行います。
<?php
$string = '12/25/08';
$pattern = '|(d{2})/(d{2})/(d{2})|';
$callback_fn = 'process';
echo preg_replace_callback($pattern, $callback_fn, $string);
function process($matches) {
print_r($matches);
return $matches[3].$matches[1].$matches[2];
}
?>
アウトプットは、以下のとおりです。
2つのスクリプトを比較すると分かりますが、preg_replace ()関数とpreg_replace_callback()関数はほとんど同じです。唯一の違いは、2番目のパラメータとして置換文字列を指定する代わりに、コールバック関数を指定する点です。
このコールバック関数を、preg_replace_callback()の1番目のパラメータで指定した正規表現とマッチがあるごとに呼び出します。
コールバック関数を呼び出したら、最初の引数でマッチする要素の配列を渡します。上述の例では、可変$matchesです。この配列は、preg_match()関数が返す配列と同じであることに留意してください。つまり、$matches[0]には指定したパターンに完全にマッチしたテキスト、$matches[1]には最初に括弧でくくられたパターンに部分的にマッチしたテキスト・・・というようになります。
上記のスクリプト例では、マッチする要素としてコールバック関数に渡す配列を読者が目で確認できるように、print_r($matches)を挿入しました。
コールバック関数の最後で、文字列を返します。これは、マッチしたアイテムの置換文字列です。マッチした文字列を変更したくない場合は、$matches[0](すなわち、元の文字列)を返します。マッチした文字列を削除したい場合は、空の文字列を返します。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.










