PHP の preg_replace_callback 関数

Perl の文字列置換では、"e" オプションを付けると 置換先の指定を実行文として処理できるので、 条件にマッチした部分をサブルーチンで処理させることができます。

ややこしいので実際の例で説明します。

sub replace {
    return "[".($1*2)."]";
}

$xx = "123456789";
$xx =~ s/(\d)/replace($1)/ge;
print $xx;

文字列置換のときに replace() サブルーチンが実行されます。
実行結果は次のようになります。

$ perl replace.pl

[2][4][6][8][10][12][14][16][18]

これと同じことを PHP でやりたい場合 preg_replace_callback() という関数を使用します。

<?php
function replace($matches) {
    return "[".($matches[1]*2)."]";
}

$xx = "123456789";
$xx = preg_replace_callback("/(\d)/", "replace", $xx);
print $xx;
?>

実行結果は同じになります。
PHP の preg_replace_callback() では条件にマッチした部分を 第二引数のコールバック関数に渡すような形になります。

Perl の "e" オプションは、実行文として処理するだけなので サブルーチンを使用せずに 次のようにも書けます。

$xx = "123456789";
$xx =~ s/(\d)/"[".($1*2)."]"/ge;
print $xx;

PHP でも別の場所にわざわざ関数を定義したくない場合 create_function() で無名関数を作るという手があります。

<?php
$xx = "123456789";
$xx = preg_replace_callback("/(\d)/"
          , create_function('$matches'
                           ,'return "[".($matches[1]*2)."]";')
          , $xx);
print $xx;
?>

Google サイト内検索

Amazonアソシエイト