2014-03-07 22 views
1

這是這裏一個棘手的問題是什麼,我試圖做的:PHP更換1日發生x和字符串的第2出現,其中y

$str="abc def abc"; 

我想123second發生更換first發生abcabc456用的preg_match 現在是可能的,我代替ABC第一次出現123這樣

preg_replace('/abc/', '123', $str, 1); 

但如何用456替換第二次出現,最重要的是如何立即執行並生成所需的字符串(即123456456)。

注意:字符串是從外部來源生成的。

感謝艾哈邁爾

+0

除了'preg_replace('/ abc /','123',$ str,1); preg_replace('/ abc /','456',$ str,1);'...'preg_replace_callback()'帶有一個回調,該回調保持每個替換的靜態計數並且可以根據該計數修改其響應 –

回答

5

你是非常接近:

$str = preg_replace('/abc/', '123', $str, 1); // will replace first 'abc' 
$str = preg_replace('/abc/', '456', $str); // will replace all others 

的原因,這會工作,是因爲第二個正則表達式的第一次出現,實際上是第二個項目。
:可讀性很強,非常容易理解和執行
精讀:字符串將regexed兩次(壞的大型字符串),選擇是有限的


如果這不是你願意的話,可以使用preg_replace_callback()

$firstHasBeenFound = false; 
function magicFunction($matches){ 
    global $firstHasBeenFound; 
    print_r($matches); 
    if(!$firstHasBeenFound){ 
     /* do something for the first time */ ; 
     $firstHasBeenFound = true; // save for next round 
    } 
    else{ 
     /* do something for the test */ ; 
    } 
} 

$str = preg_replace_callback('/abc/', 'magicFunction', $str); 

:很多更多的變種可以進行,更多的控制Ø版本代碼,字符串的唯一一個解析
精讀:比較難讀/執行

在這個例子中,我使用$firstHasBeenFound,但你可以使用一個增量做點什麼各2次,或東西時,你會發現比賽7,等

+0

Err。爲什麼在'preg_replace_callback'存在時使用hack? – Leri

+0

哈哈,我正在那個更新 – Martijn

+0

哈哈。爲什麼我沒有想到這一點。所以愚蠢的 –

2

這個怎麼樣?:一個

$str = preg_replace('/abc(.*?)abc/', '123${1}456', $str, 1); 
+1

我喜歡這個想法,但是當你使用更大的正則表達式時,這會導致一團糟。但對於小的替換,這將是偉大的 – Martijn

+0

@Martijn是的,可能會。因爲它需要將團隊保持在1美元,並且在最糟糕的情況下會很沉重! –

0
$str="abc def abc ghi abc"; 
$replacements = array('123', '456'); 

$str = preg_replace_callback(
    '/abc/', 
    function ($matches) use ($replacements) { 
     static $counter = 0; 
     $returnValue = $matches[0]; 
     if (isset($replacements[$counter])) 
      $returnValue = $replacements[$counter]; 
     $counter++; 
     return $returnValue; 
    }, 
    $str 
); 

var_dump($str); 
0

您可以使用preg_replace_callbackclosure回調(工作在PH P 5.3+)。

$str = "abc def abc abc def abc"; 
$a_replc = array('123', '456'); 
$n = 0; 
$str = preg_replace_callback('/abc/', function() use (&$n, $a_replc) { 
    return $a_replc[$n++ % count($a_replc)]; 
}, $str); 
相關問題