İşte bir sürümü bulunuyor.
$replacements = array('puppy', 'cute', 'ridiculously', '1300');
$input = 'This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.';
$output = preg_replace_callback('/(?<!\\\\)\$(\d+)/', 'replace_input', $input);
echo $input . "<br>";
echo $output;
function replace_input($matches) {
global $replacements;
$index = $matches[1];
return $index < 0 || $index >= count($replacements) ? $matches[0] : $replacements[$index];
}
Çıktı:
This $0 is $2 $1. Still, \$3 is a lot to pay for a puppy.
This puppy is ridiculously cute. Still, \$3 is a lot to pay for a puppy.
O değişken kaçmak için $ önce ters eğik çizgi işler. O zaman daha da güçleştirmektedir (ve bu durumda ele değildir) backslash'lar, kaçmak gerekir çünkü bir garip sözdizimi olabilir. Düzenli ifade temelde $ (a negative lookbehind kullanarak) bir ters eğik çizgi önünde olmadığı sürece, bir veya daha fazla rakam takip $ demektir.
Bu değiştirmeleri dizi için küresel kullanır. Bu iki alternatif vardır:
- Bir kapatma kullanın (PHP 5.3 + gerektirir); veya
create_function()
a> kullanın.
Ama biz böyle şeyler için sahip olağan tiksinme rağmen farklı bir şey yapmak için iyi bir nedeniniz olmadıkça, küresel basit ve "küresel" olduğunu düşünüyorum.