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;
?>