2017-07-31 58 views
1

我有一個這樣的字符串:如何使用preg_replace在每次迭代中替換一個重複的子字符串?

$replace = "I am a [[boy]], he is a[[boy]] too." 

我想要做的是,以取代第一[[boy]]字「BLANK1」,第二[[boy]]與「BLANK2」。

我曾嘗試:

for($i=1;$i<=count($questions[$qn_count]['correct_ans']);$i++){  
    $word = "##BLK".$i."##";     
    $pattern_bracket = "/\[\[([^\]]+)\]\]/";    
    $ff = preg_replace($pattern_bracket,$word , $replace, $i);   
} 
$questions[$qn_count]['body'] = $ff; 

以上[[ ]]總是似乎是相同的替換用## BLK2 ##。 是否可以替換兩個括號將不同的值?

+0

爲什麼正則表達式是靜態詞? – Andreas

+0

我認爲這是一樣的,因爲[[男孩]]也會出現兩次。 – killer2318

+0

一個簡單的str_replace就足夠了如果它只是@Andreas提到的靜態詞。如果不是,你可以添加$ pattern_bracket變量中的內容嗎? – alpadev

回答

0

你的問題是在細節上有點模糊,但我認爲這是你正在尋找的一般方法:

代碼:(Demo

$string="I am a [[boy]], he is a[[boy]] too."; 
$swaps=['Blank1','Blank2']; 
echo "$string\n"; 
foreach($swaps as $swap){ 
    $string=preg_replace('/\[{2}[^]]+\]{2}/',$swap,$string,1); 
    echo "$string\n"; 
} 

輸出:

I am a [[boy]], he is a[[boy]] too. 
I am a Blank1, he is a[[boy]] too. 
I am a Blank1, he is aBlank2 too. 

只是一些注意事項:

  • 你不需要逃避否定字符類中的方括號。
  • 使用大括號內的量化值{2}將比重複的字符等效性更有效。
  • 由於您只需一次更換一個,因此使用1作爲preg_replace()的第四個參數而不是變量。
+0

@ killer2318您的問題似乎無法通過SO軟件解決。我的答案能解決你的問題嗎?還是還有一些不太正確的東西。確認問題的解決方案有益於未來的SO讀者,並將您的問題確定爲不再需要支持。 – mickmackusa

相關問題