$subject = '0300020F005176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D';echo preg_replace('/^(\w{8})\w{2}/i','$1'.'08',$subject);// 輸出結果:85176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D// 期望結果:0300020F085176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D// 但是:preg_replace('regex','$1'.'__',$subject); 這樣是沒有問題的
回複內容:
$subject = '0300020F005176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D';echo preg_replace('/^(\w{8})\w{2}/i','$1'.'08',$subject);// 輸出結果:85176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D// 期望結果:0300020F085176C5A11A730004F955A2A20CD8-367C-EC5B-9D8C-2CAA0B8FE45D// 但是:preg_replace('regex','$1'.'__',$subject); 這樣是沒有問題的
引自PHP手冊preg_replace函數對後向引用的描述:preg_replace
當在替換模式下工作並且後向引用後面緊跟著需要是另外一個數字(比如:在一個匹配模式後緊接著增加一個原文數字), 不能使用\1這樣的文法來描述後向引用。比如, \11將會使 preg_replace() 不能理解你希望的是一個\1後向引用緊跟一個原文1,還是 一個\11後向引用後面不跟任何東西。 這種情況下解決方案是使用\${1}1。 這建立了一個獨立的$1後向引用, 一個獨立的原文1。
你的替換部分是“$108”,所以這裡的需要將$1替換為${1}以免混淆.
echo preg_replace_callback('/^(\w{8})(\w{2})/i',create_function( // single quotes are essential here, // or alternative escape all $ as \$ '$matches', 'return $matches[1].\'08\';' ),$subject);
這樣,callback處理