Php aynı dizesinde birden çok dize değiştirmeleri

4 Cevap php

Ben aşağıdaki dize değiştirme sorunu var ve ben burada oldukça bir düzeltme duyuyorum

PFB örnek dize

$string = 'The quick sample_text_1 56 quick sample_text_2 78 fox jumped over the lazy dog.';

$patterns[0] = '/quick/';
$patterns[1] = '/quick/';
$patterns[2] = '/fox/';

$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';

echo preg_replace($patterns, $replacements, $string);

Ben göndermek sayılarına bağlı olarak 'hızlı' değiştirmeniz gerekiyor

yani bir işleve benim girişi ise 56, quick 56 bear ile değiştirilmesi gerekiyor ve eğer önce bir benim girdi fonksiyonudur 78, hızlı 78 ile değiştirilmesi gerekmektedir önce black

Birisi bana bu konuda yardım edebilir misiniz?

4 Cevap

Bunu yanlış şekilde yapıyoruz. Bunun yerine fonksiyon girişine bağlı olarak doğru find kullanın ve değerlerini değiştirmeniz gerekir. Sadece find bir harita oluşturmak ve fonksiyon giriş değerine bağlı olarak değerleri değiştirin. Gibi:

$map = array( 56 => array('patterns' => array(), 'replacements' => array()), 78 => array(...) );

Bunun yerine preg_replace, substr_replace to do your string replacement and strpos geçmek parametrelere dayalı dize içinde başlangıç ​​ve bitiş noktalarını bulmak için kullanabileceğiniz çalışma. Sizin desen basit bir dize, bu yüzden normal bir ifade gerektirmez ve substr_replace (aradığınız ne gibi görünüyor ki) değiştirmeleri yapmak için dize içinde bir başlangıç ​​ve bitiş noktasını belirtmek için izin verir.

EDIT:

Eğer kontrol bir sürü yapmak zorunda gibi Yorumlarınız dayanarak, bu sesler. Ben bu test değil, bu yüzden bir hata ya da iki tane var, ama bu gibi bir işlevi deneyebilirsiniz:

function replace($number, $pattern, $replacement)
{
    $input = "The quick sample_text_1 56 quick sample_text_2 78 fox jumped over the lazy dog.";
    $end_pos = strpos($input, $number);
    $output = "";
    if($end_pos !== false && substr_count($input, $pattern, 0, $end_pos))
    {
    	$start_pos = strrpos(substr($input, 0, $end_pos), $pattern);
    	$output = substr_replace($input, $replacement, $start_pos, ($start_pos + strlen($pattern)));
    }
    return $output;
}

Bu işlev aşağıdakileri yapar:

  1. İlk olarak, "numara" parametresi bile dize varolduğunu kontrol ($end_pos !== false)
  2. Desen dize teh başında ve sayısının pozisyonu arasında en az bir kez bulunup bulunmadığını kontrol edin (substr_count($input, $pattern, 0, $end_pos))
  3. Alt dize içindeki desen son oluşumu konumunu almak için strrpos işlevini kullanın
  4. Kullanarak değiştirme dizesi eklemek için başlama pozisyonu ve desen uzunluğunu kullanın substr_replace

Bu deneyin:

$searchArray = array("word1", "sound2", "etc3");
$replaceArray = array("word one", "sound two", "etc three");
$intoString = "Here is word1, as well sound2 and etc3";
//now let's replace
print str_replace($searchArray, $replaceArray, $intoString);
//it should print "Here is word one, as well sound two and etc three"