Bir diziden bir dize belirteçleri değiştirilmesi

4 Cevap

Diyelim ki bir dize var

Bu $ 0 $ 2 $ 1. Yine, \ $ $ 3 köpek yavrusu için ödemek için bir çok şey var.

ve yedek bir dizi

array('puppy', 'cute', 'ridiculously', '1300')

Ne beni ($ bu durumda) belirteç karakteri ters eğik çizgi-kaçırma, dizideki karşılık gelen öğelerle dize belirteçleri yerine temiz yolu olurdu? Ben de boş dize ile eşsiz belirteçleri değiştirmek istiyor.

4 Cevap

i "\ $ 3", "$ $ 3 \" değil demek sanırım

preg_replace('~(?<!\\\\)\$(\d+)~e', 'isset($array[$1])?$array[$1]:""', $source);

btw, sen sprintf (http://php.net/manual/en/function.sprintf.php örnek 3) yanı sıra params'ı sayılı sağlar biliyor muydunuz

$test_sub= 'This $0 is $2 $1. Still, \$$3 is a lot to pay for a puppy.';
$GLOBALS['replacers'] = array('puppy', 'cute', 'ridiculously', '1300');
echo preg_replace_callback('/[^\$]\$([0-9])+/',
    create_function(
    	'$matches',
        'return $matches[0][0] . $GLOBALS[\'replacers\'][$matches[1]];'
    ),
    $test_sub
);

Bu nasıl yapılabilir bir POC olduğunu. Basit bir düzenli ifade ve değiştirme için bir geri arama. Gerçek uygulama onunla yapmak istediğiniz tam olarak ne değişir. Ben yardımcı umuyoruz.

İş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:

  1. Bir kapatma kullanın (PHP 5.3 + gerektirir); veya
  2. create_function() 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.

Bu çözüm soruyu takip ve Josh Leitzel cevabı biraz ödünç alır. Eşsiz desenler (örn. $ 4, 5 $) giriş çıkardıktan, boş bir dize ile değiştirilir.

$input = "This $0 is $2 $1. Still, \$$3 is a lot to pay for a puppy.";
$replacements = array('puppy','cute','ridiculously','1300');
$pattern = "/[$]{1}([0-9]{1})/";

preg_match_all($pattern, $input, $matches);

if (isset($matches[1]))
 foreach ($matches[1] as $key => $value)
 {
  $input = str_replace("$".$value, $replacements[$value], $input);
 }

echo $input;

Çıktı:

Bu köpek yavrusu gülünç şirin. Yine de, 1300 $ bir köpek yavrusu için ödemek için bir çok şey var.