2014-12-04 74 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