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公開)

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](すなわち、元の文字列)を返します。マッチした文字列を削除したい場合は、空の文字列を返します。


1    2    3    4    5    次のページ

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