2010-08-03 131 views
0

我有一個字符串中有相同的字符多次,我想用數組中的不同字符串替換此字符的每個出現。即就像在準備好的發言:用不同的字符串替換幾次相同的字符

字符串:"SELECT * FROM x WHERE a = ? AND b = ?"
陣:['alpha', 'beta']

結果:"SELECT * FROM x WHERE a = alpha AND b = beta"

+0

您正在使用什麼數據庫接口?它可能具有內置的能力(它可能更安全)。 – strager 2010-08-03 03:03:58

+0

是的,當然數據庫接口有這個通常內置的,但我只是想要類似SQL的語法作爲例子,因爲大多數人已經知道它。在這裏已經有一些很好的解決方案,我只是想弄清楚哪一個最適合我。 – Matt 2010-08-03 13:53:28

回答

7

如果您有過更換性格是什麼樣的控制,使用sprintf

sprintf('Hello %s, how %s %s?', 'World', 'are', 'you'); 

vsprintf

vsprintf('Hello %s, how %s %s?', array('World', 'are', 'you')); 

而且,即使你不這樣做:

$str = 'Hello ?, I hope ? ?.'; 
$str = str_replace('?', '%s', $str); 
$str = sprintf($str, "World", "you're", "fine"); 
+0

這可能很難以編程方式使用,因爲替換次數可能不固定。 ['vsprintf'](http://www.php.net/manual/en/function.vsprintf.php)是一個更好的解決方案。 – Artefacto 2010-08-03 03:27:12

+0

好點,取決於它應該如何使用。 – deceze 2010-08-03 03:28:49

+0

@deceze,他特別說「從數組中」,儘管我承認OP經常指向一個解決方案的中途,而這個解決方案並沒有真正解決其根本問題。 – Artefacto 2010-08-03 03:35:34

3

試試這個:

$str = "SELECT * FROM x WHERE a = ? AND b = ?"; 
$arr = array("alpha", "beta"); 
foreach ($arr as $s) 
    $str = preg_replace("/\?/", $s, $str, 1); 
echo $str; 

here。第四個參數將每次運行的最大替代次數限制爲一次而不是無限次。

+1

這可能是因爲我認爲正則表達式是魔鬼魔法,但這似乎不是一點點鈍嗎?看到修改問題的參數只是一點點,使得整體上更多的解決方案。 (請參閱sprintf) – 2010-08-03 03:15:41

+0

是的,您可能是對的,sprintf對於作者而言很可能已足夠。但是,它並不像原始問題中指定的那樣使用數組,這使得它成爲一種更通用的方法(假設您需要數組)。 – XQYZ 2010-08-03 03:25:40

+0

有'vsprintf',他也可以使用'sprintf' +'call_user_func'(儘管最後一個會很尷尬)。 – Artefacto 2010-08-03 03:30:38

1

無正則表達式函數(作爲獎勵,也允許替換任意字符串,而不是隻是字符):

function replacement($string, $search, array $replacements) { 
    $pos = 0; 
    while (($f = strpos($string, $search, $pos)) !== FALSE) { 
     $r = array_shift($replacements); 
     $string = substr($string, 0, $f) . $r . 
      substr($string, $f + strlen($search)); 
     $pos = $f + strlen($r); 
    } 
    return $string; 
} 

例子:

echo replacement("sf sdf aaasdf sdsaaaaggg", "aa", 
    array("alpha", "beta", "gammma")); 

給出:

 
sf sdf alphaasdf sdsbetagammmaggg