セキュリティ上の理由で preg_replace が制限されている環境での代替関数

preg_replace 関数は使い方によっては任意のコードを実行できる脆弱性を生むことがあるため、php.ini の disable_functions によって使用を禁止されている場合がある。

しかしライブラリ中でも preg_replace が使われる機会は多い。そこで次の関数を定義する。(PHP 5 >= 5.3.0)

<?php
function preg_replace2($pattern, $replacement, $subject, $limit = -1, &$count = '__preg_replace2_args_4') {
	if ($count === '__preg_replace2_args_4') {
		unset($count);
	}
	return preg_replace_callback($pattern, function() use($replacement) { return $replacement; }, $subject, $limit, $count);
}

// test
echo preg_replace2('{/usr\b}', '/opt', '/usr/local/bin/php:/usr/local/bin/ruby', -1, $count);
echo '<br>', $count;

ToDo

  • “\1” などによる参照を展開する