2008年8月15日金曜日

PHPで出力する文字列をまとめて変換する

ob_start()を使うと、出力する文字列をまとめてfunctionに渡すことができる。

bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )

この関数は出力のバッファリングをオンにします。出力のバッファリングを有効にすると、(ヘッダ以外の) スクリプトからの出力は実際には行われず、代わりに内部バッファに保存されます。

$output_callbackにはコールバックするfunction名を文字列として指定する。

ob_end_flush()等をしなければ、バッファにたまった文字列はPHPスクリプトの終了時にコールバックのfunctionに渡される。
なので、出力全体を変換したい場合は明示的にob_end_flush()する必要はない。

コールバックのfunctionにはバッファにたまった文字列が渡される。
コールバックのfunctionが戻り値として文字列を返すと、その文字列が出力される。

//例
ob_start('zenkaku2hankaku');

function zenkaku2hankaku($str) {
  return mb_convert_kana($str, 'ask');
}
なので、mb_output_handlerのように、文字列としてデータを受け取り戻り値も文字列の標準関数だと使いやすい。

また、ob_start()は重ねて実行できる。
出力バッファはスタッカブルであり、このため、他の ob_start() がアクティブの間に ob_start() をコールすることが可能です。この場合、ob_end_flush() を適切な回数コールするようにしてください。複数の出力コールバック関数がアクティブの場合、ネストした順番で逐次連続的に出力がフィルタ処理されます。

2回以上ob_start()を実行した場合、ob_start()を実行した順と逆の順番にコールバックのfunctionが呼ばれる。
<?php
ob_start('test2');
ob_start('test1');

echo '1st';

function test1($s) {
  return str_replace('1st', '2nd', $s);
}
function test2($s) {
  return str_replace('2nd', '3rd', $s);
}

// => "3rd"が出力される

0 件のコメント:

ブログ アーカイブ

tags