substr_replace 如何替換多個字串不同位置不同長度的子串
都知道substr_replace可以替換指定位置的子串。比如substr_repace("Hello Test",'xxxx',1,4)替換成Hxxxx Test
那麼如何實現替換多個字串不同位置不同長度的子串。
$data = [ 'Hello Test', 'QQ mytest', 'Sina email' ]
比如上面一個數組,現在需要把陣列第i個元素的第i個字串後面的4個字串替換陳xxxx
$data = [ 'Hxxxx Test', 'QQxxxxest', 'Sinxxxxail' ]
其實,substr_replace也可以實現多個字串子串的替換。
substr_replace函式定義
substr_replace ( mixed $string , mixed $replacement , mixed $start [,mixed $length] ) : mixed
substr_replace原始碼在ext/standard/string.c中。先看一下整體的結構
substr_repace首先根據替換需要替換的內容的型別區分。字元型別和陣列型別的替換採用不同的處理方式。同時字元型別也對起始位置引數 from
做了限制,這中情況下,不接受陣列型別作為起始位置。
對於字元資料的替換
如果替換的目標是一個數組,則取陣列第一個元素作為實際替換的內容。
l是傳入的第四個引數處理之後的長度值(l取值0-原字串長度)。然後執行三個copy操作,分別把from之前的原始字串,替換後的字串,from+l之後的字串拷貝到結果字串中取。所以說,這裡的l指定的是原字串有多少個字元被替換。
如果要替換的內容是一個字串陣列的話,內部處理結構如下:
執行一個for迴圈,拆分成對每個陣列元素的處理。在陣列處理中,需要處理起始位置引數,長度引數是陣列的情況。所以迴圈中對form,len,repl引數型別進行檢查。如果是陣列型別,則在每次替換之後下標進行加一操作。保證每次迴圈,獲取到的是對應於該陣列元素需要替換的內容,起始位置,和替換長度。
對於substr_replace有以下幾點需要了解:
1. length長度是指替換長度,用repacement替換 string[start]...string[start+length],下面幾個例項能夠很好的說明其中的含義。
length長度小於替換字串長度的時候,比如substr_replace('Hello Test','xxxx',2) 輸出內容Hxxxxlo Test。
length長度大於替換字串長度,比如substr_replace('Hello Test','xxxx',6) 輸出內容Hxxxxest
length大於原字串長度的時候,比如substr_replace('Hello Test','xxxx',12) 輸出內容Hxxxx
2. string為字串的時候,replacement可以是陣列,實際替換是去陣列第一個元素
substr_replace('Hello Test',['xxxx'],4)實際上和 substr_replace('Hello Test','xxxx',4)效果一樣
3. 當需要替換的內容是陣列的時候,replacement,from,length可以是陣列,也可以部分是陣列。php對於幾個陣列引數,如果不對應會進行相應的處理
$s1 = substr_replace( ["Hello Test"], ["xxxx"], [1,2],[3,4] ); $s1=>[ [0]=>'Hxxxxo Test' ]
起始位置和長度比要替換的內容多,自動忽略。
$s2 = substr_replace( ["Hello Test","qqqq"], ["xxxx"], [1], [3] ); $s1=>[ [0]=>'Hxxxxo Test', [1]=>'' ]
原陣列多,替換後陣列少,則相當於替換成空字串,即等價於一下內容:
$s2 = substr_replace( ["Hello Test","qqqq"], ["xxxx",""], [1], [3] ); $s1=>[ [0]=>'Hxxxxo Test', [1]=>'' ]
$s2 = substr_replace( ["Hello Test","qqqq"], ["xxxx","ff"], [1], [3] ); $s1=>[ [0]=>'Hxxxxo Test', [1]=>'ff' ]
替換起始位置,長度陣列不夠,則認為起始位置是0,長度是整個字串。即等價於:
$s2 = substr_replace( ["Hello Test","qqqq"], ["xxxx","ff"], [1,0], [3,strlen("qqqq")] ); $s1=>[ [0]=>'Hxxxxo Test', [1]=>'ff' ]
如果部分引數不是陣列,則對需要替換的陣列都是有效的。
$s2 = substr_replace( ["Hello Test","qqqqq"], "xx", [1,0], 3); $s1=>[ [0]=>'Hxxo Test', [1]=>'xxqq' ]
等價於
$s2 = substr_replace( ["Hello Test","qqqqq"], ["xx","xx"], [1,0], [3,3] ); $s1=>[ [0]=>'Hxxo Test', [1]=>'xxqq' ]