2016-09-16 56 views
1

我想我怎麼能更換表單名稱的最後一個項目是這樣的:PHP:在字符串中的最後一個括號替換文本

content[1] 
content[1][officeImage] 
content[2][officeImage] 
content[3][something][officeImage] 
... 

的「陣列」深度可以無限大,我需要更換最後他像這個:

content[replaced] 
content[1][replaced] 
content[2][replaced] 
content[3][something][replaced] 
... 

在這裏有人誰可以寫preg_replace()或等? 感謝

編輯:

我有這樣的:

preg_replace('~\[.*!?\]~', '[replaced]', $parent); 

但它從 「content[1][officeImage]」 這個 「content[replaced]」 迴歸:

+0

取一個變量中是最後一個項目,你可以根據你的計劃打 –

+0

張貼您的企圖/ .. –

+2

它是一個數組還是一個文本文本? – revo

回答

3

Try this:

preg_replace('~^.*\[\K[^]]+~m', 'replaced', $parent); 

m(多行)修飾符僅在$parent包含需要一次替換的多行時才需要。

這裏的大伎倆是從^.*\[\K開始。這說的是匹配從行首開始到\[的所有事情。由於這是一個「貪婪」的重複,它將繼續前進,直到最後一個實例(.與不包含s修改符的換行符不匹配)。 \K丟掉了所有匹配的內容,所以我們只替換括號內的內容。

+1

我不知道'\ K',我會看看!榮譽:) –

+0

PCRE-only,但它可以使這種情況下更有效的查詢更簡單。通過用'\ 1 [替換'替換'〜^(。* \ [[] [^]] +〜m',您可以在這裏不用'\ K'就可以離開。當然不太優雅。 – Sam

+1

哈哈我現在發現這個: preg_replace('〜。* \ K \ [。*!?\]〜s','$ 1'。'[replaced]',$ parent); 有什麼區別? – landsman

0

您可以使用此代碼:

$re = "/\\[([^]]*)\\][^]]*$/m"; 
$str = "content[1]\ncontent[1][officeImage]\ncontent[2][officeImage]\ncontent[3][something][officeImage]"; 
$subst = "[replacement]"; 

$result = preg_replace($re, $subst, $str); 

看到它live PHPlive Regex

+0

絕對是一種可行的方法,但'[]'集合的重複匹配增加了超過必要的步驟。 (僅供參考。) – Sam

0

試試這個:

$string = 'content[3][something][officeImage]'; 
$replaced = 'somestring'; 
$result = preg_replace('/(.*\[)(.*?)]$/m','$1'.$replaced.']',$string); 
+1

添加'm'修飾符以使該表達式一次處理多行輸入。 – Sam

相關問題