2012-03-18 125 views
2

我遇到的問題是我需要的數據字符串替換幾個變量,例如:str_replace函數和數字

Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15 

所以,問題是,當我經歷了所有的字符串迭代,該S_1更換不希望可以代替S_10S_15第3個字符,所以字符串像

Blah blah APPLE0 blah APPLE blah blah ORANGE blah blah APPLE5 

什麼是解決這個難題的最佳途徑?

+0

這取決於你如何執行更換什麼代替S_ * ..你能不能代碼? – digEmAll 2012-03-18 10:06:15

回答

0

可能不是最好的解決方案,但給出的信息。也許你可以使用字符串替換方法(str_replace),順序爲S_15,S_10,S_5,然後是S_1。這樣你就不會發生衝突。

2

這裏,你可以隨時使用arrange the search keys by length/value in descending order

str_replace(array('S_15', 'S_10', 'S_1'), array('your replacements'), $string); 
+0

當替換包含'str_replace(array('S_15','S_10'),array('S_10','foo'),'S_15')'中的後續搜索項時,這將失敗。 – Gumbo 2012-03-18 10:17:37

+0

@Gumbo同意,但大多數情況下,您不會使用包含相同搜索關鍵字的替換替換搜索關鍵字。 – Rezigned 2012-03-18 10:20:27

-1

與預浸更換提示:

?php 
$a = "Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15"; 
$search = array("/S_1([0-9]+|)/", "/S_5([0-9]+|)/"); 
$replace = array('APPLE', 'ORANGE'); 

$a = preg_replace($search, $replace, $a); 

echo $a; 
?> 
+0

該代碼將'S_15'變成'APPLE5',這是OP想要避免的。 – digEmAll 2012-03-18 10:12:06

+0

正則表達式修復對不起 – ZiTAL 2012-03-18 10:23:14

3

而是一次更換一個長期的,發現所有條款並立即更換。您可以使用preg_replace_callback執行正則表達式搜索和調用一個函數,每場比賽有相應的更換來替換它:

$mapping = array('S_1' => 'APPLE', 'S_2' => 'ORANGE'); 
$output = preg_replace_callback('/S_\d+/', function ($match) use ($mapping) { 
    return array_key_exists($match[0], $mapping) ? $mapping[$match[0]] : $match[0]; 
}, $input); 
0

你可以通過串尋找「S_」當你找到它,你識別數量,並與相應的項目替換它,所以:

<?php 
$text = "Blah blah S_10 blah S_1 blah blah S_5 blah blah S_15"; 
for($i=0;$i<strlen($text);$i++){ 
if($text[$i] == "S" and $text[$i+1] == "_"){ 
    $j = $i+2; 
    while($text[$j] != " "){$j++;} 
    $value = substr($text, $i,$j-1); 
    $text = substr($text, 0, $i-1)+replace($value)+substr($text, $j); 
    } 
    } 
?> 

,並在功能替代,您想要