2012-03-28 111 views
1

我有這樣的SQL命令:str_replace只替換特定的發生?

$sql = "INSERT INTO foo (value, value2, value3) 
     VALUES (value1, value2, value3)"; 

而且我想, 1234567890)

結果,以取代第一), custom_value), 同樣,第二)應該是這樣的:

$sql = "INSERT INTO foo (value, value2, value3, custom_value) 
     VALUES (value1, value2, value3, 1234567890)"; 

我試圖用str_replace()替換所有的事件。

是否有某些選項只能替換特定的事件?

回答

-1

如果你有php> 5.0,你可以使用countstr_replace來設置你需要多少替換。

+0

的'count'參數實際上是一個變量引用其中'str_replace()'將返回替換出現次數。它不是*限制或偏移參數。 – Kaii 2012-03-29 07:09:13

1

嘗試以下方法:在我的本地設置

$sql = str_replace('value3', 'value3, %s', $sql); 
$sql = sprintf($sql, 'custom_value', '1234567890'); 

測試:

$sql = '(value, value2, value3) (value1, value2, value3)'; 
$sql = str_replace('value3', 'value3, %s', $sql); 
$sql = sprintf($sql, 'custom_value', '1234567890'); 

// produces (value, value2, value3, custom_value) (value1, value2, value3, 1234567890) 
echo $sql; 

這是一個可重複使用的函數:

function replace_occurence($search, $replace, $subject) { 
     $subject = str_replace($search, '%s', $subject); 
     array_unshift($replace, $subject); 
     return call_user_func_array('sprintf', $replace); 
} 
$sql = '(value, value2, value3) (value1, value2, value3)'; 
$sql = replace_occurence(')', array(', custom_value)', ', 123456790)'), $sql); 
+0

我喜歡另一種方式... – KoolKabin 2012-03-28 09:32:39

+0

是啊,漂亮啊:) – 2012-03-28 09:34:16

+1

@Kaii完全錯過了問題:S,將很快刪除這個。謝謝 – 2012-03-28 09:45:48

1

你給..你可以使用這個表達式的例子:

#(\).+?\(.+)(\))# 

在PHP代碼,它看起來像這樣:

$sql = preg_replace("#(\).+?\(.+)(\))#", 
        ", custom_value\1, 1234567890\2", 
        $sql, -1, $count); 

它會搜索關閉括號後面帶一個開括號,之後將查找最新的閉括號

示例: http://xrg.es/#b1uu3f

+0

只適用於特定的例子..實際的SQL代碼如下所示:INSERT INTO foo(value,value2,value3)VALUES(value1,value2,value3) ',正則表達式無法正確替換。 – Kaii 2012-03-28 10:35:08

+0

簡單修復您建議的問題..現在代碼應該可以工作 – SERPRO 2012-03-28 10:42:15

1

PHP的基本功能集中沒有這樣的東西。但是你可以使用substr_replace()來實現它。

$sql = "foo (bar, baz, blub) bar (boo, far, faz)"; 

// only replace first occurance 
$firstpos = strpos($sql, ')'); 
$sql = substr_replace($sql, ', custom_value)', $firstpos, 1); 

// only replace second occurance 
$secondpos = strpos($sql, ')', strpos($sql, ')') + 1); 
$sql = substr_replace($sql, ', 123456)', $secondpos, 1); 

echo $sql, PHP_EOL; 

結果:

foo (bar, baz, blub, custom_value) bar (boo, far, faz, 123456) 

改寫爲可重複使用的功能:

function str_replace_occurance($search, $replace, $subject, $occurance) { 
    $pos = NULL; 
    for ($i = 1; $i <= $occurance; $i++) { 
     $pos = strpos($subject, $search, ($pos===NULL) ? 0 : $pos+1); 
    } 
    return substr_replace($subject, $replace, $pos, strlen($search)); 
} 

$sql = str_replace_occurance(')', ', custom_value)', $sql, 1); 
$sql = str_replace_occurance(')', ', 1234567890)', $sql, 2); 
echo $sql, PHP_EOL; 

編輯:重新排序參數,以具有相同的順序和名稱與原始str_replace