2014-12-04 34 views
1

我有我認爲會是一個簡單的preg_replace但是導致我幾個問題。Preg_replace行爲不如我預期

輸入
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]

代用
preg_replace("/\[(\d+)\]/", "\$(${1})", $output);

期望輸出
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/$(1)

這樣做的目的是爲了從舊的API移動到一個新的 - 在[1]可在輸入字符串中的任何位置

我遇到的問題是,這是輸出
Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/$()
,似乎是忽略了捕獲組

編輯: 解決通過改變置換到
preg_replace('#\[(\d+)\]#', '\$(${1})', $output);

+0

是U肯定嗎?似乎工作[完美](http://ideone.com/qLdRPy) – DarkBee 2014-12-04 20:12:43

+0

我很積極。我嘗試了幾種格式的變體,我無法讓它輸出捕獲組中的數字。它在這裏也很完美:http://www.phpliveregex.com/p/8BE 到目前爲止的完整腳本可以在http://pastebin.com/hWvR6qfb 找到,因爲我猜它可能是我的東西在這裏做錯了 編輯:沒關係我只是檢查你的例子,它的工作..我似乎錯過了「#」。請回答你的例子,我會標記爲完整:)(不是我明白'#'是什麼:P – 2014-12-04 20:16:31

+0

'#'只是[delimeters](http://php.net/manual/ en/regexp.reference.delimiters.php),它標誌着RegEx的開始和結束。分隔符可以是任何非字母數字,非反斜槓,非空白字符,我只是更喜歡'#',大多數人傾向於使用'/' – DarkBee 2014-12-04 21:27:39

回答

1

你幾乎得到了它對。這確實對我的工作:

$output = 'Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]'; 
$new_output = preg_replace("/\[(\d+)\]/", "\$($1)", $output); 

print($new_output."\n"); 

隨着大括號,你可以插入一個PHP變量和替換文本單獨像這樣

$php_var = 'replacement'; 
$output = 'Thank you $(-1) for raiding us! Go follow him guys! twitch.tv/[1]'; 
$new_output = preg_replace("/\[(\d+)\]/", "\$(${php_var}_and_then_some)", $output); 

print($new_output."\n"); 
+0

啊這是有道理的! preg_replace用法中有這麼多修飾符我想我迷失在我的括號和大括號中:D 謝謝你的幫助! – 2014-12-04 20:23:58