2016-03-30 19 views
1

bu basit olmalıdır gibi görünüyor ama şu kod çalışmıyor test3' vb bir metinde $ ve dizide [1], [2] $ dizi $ dizide [3] değerleri ile değiştirin vbphp preg_replace

yanlış yapıyorum?

$text = preg_replace_callback('/(test)([0-9]+)/i', 
           function($m) use($array) { return $m[1].$array[$m[2]]; }, 
           $text); 

fonksiyon maçları alır ve endeks olarak ikinci yakalama grup maçı ile dizi öğe ile birleştirilmiş ilk yakalama grup maçı kullanır:

+1

'preg_replace_callback()' işlevini kullanmak ve diziyi 'use()' ile iletmek için, – Rizier123

+0

preg_replace için ikinci argüman, $ n biçiminde referanslar içerebilecek bir değiştirme dizgisini alır. Bunlar php değişkenleri değildir, böylece onları istediğiniz gibi kullanamazsınız. – georaldc

cevap

3

Bir geri arama kullanmak gerekir. İlk olarak $array[$m[2]]'un var olduğunu kontrol etmek için bir tane isteyebilirsiniz.

foreach($array as $key => $val) { 
    $text = str_replace("test$key", "test$val", $text); 
} 
+0

Teşekkürler! Parlak! – Bintz

0

Zaten cevabı var:

Alternatif bir döngü kullanabilirsiniz. Bu sadece varsayım hatalarınızdaki yorumlardan daha iyi açıklamak içindir.

$1 birinci parametrenin bir sonucu değildir, bu preg_replace kendisi sadece kullanılan bir tutucudur. Kullanımınız ayrıca komutların önceliğini de çağırır. Başka bir deyişle

, bu kodu denerseniz: Bu çıktıyı elde

$text = 'Lorem test8 Dolor'; 
function test($arg) { echo $arg.PHP_EOL; } 
$text = preg_replace('/test([0-9]+)/i', test("$1"), $text); 
echo $text; 

: o zaman

$1 
Lorem Dolor 

Gördüğünüz gibi, ilk argüman değerlendirilir, sonuç preg_replace: test() işlevi tarafından kullanılan $1 (ve dizininizle aynı şekilde) alırsınız, 8 retrie preg_replace ile ved; daha sonra preg_replace, ikinci bağımsız değişkende döndürülen değerle eşleşen alt dizeyi değiştirin: Yukarıdaki durumda test(), hiçbir şey döndürmez, bu nedenle değiştirme hiçbir şey değildir. Bu kod ile

:

Lorem [8] Dolor 

test() çünkü döner [$1] ve değiştirme işlemini gerçekleştirmek için preg_replace tarafından kullanılabilir:

function test() { return '[$1]'; } 
$text = preg_replace('/test([0-9]+)/i', test(), $text); 

çıkan dizedir.

$array["$1"] = 'Ipsum'; 
$text = preg_replace('/test([0-9]+)/i', $array["$1"], $text); 

son metindir: Belirli bir durumda

, yedek sana bu tür bir senaryo varsa sadece gerçekleşmesi

Lorem Ipsum Dolor 

Bu değil istediğiniz sonucu ancak - Daha önce de belirtildiği gibi - zaten cevabınız var ...