我对preg_replace()函数有疑问。我正在使用'e'修饰符。这是代码片段:
$batchId = 2345;
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
'translate_indicator(\'$0\', {$batchId})', $code);
我希望能够访问$batchId
函数中的translate_indicator($code, $batch=false)
变量。遗憾的是,上述问题无效:$ batch在var_dump()
内不可见(bool(false)
结果为translate_indicator()
)。
可能我在替换代码中有语法错误。或者,也许,用preg_replace()
更新前两个答案。
感谢您的回答,但您的建议没有帮助。此外,我已经尝试过双qoutes而不是单qoutes。我只是简化了代码来测试将参数传递给函数的可能性:
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
"translate_indicator('$0', 12)", $code);
此外,我已在translate_indicator()
内删除了$ batch的默认值。结果:
Warning: Missing argument 2 for translate_indicator()
所以我认为使用这种方法传递参数是不可能的。:(
答案 0 :(得分:1)
试试这个
$batchId = 2345;
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
"translate_indicator('$0', {$batchId})", $code);
单引号字符串未扩展(即$ batchId不会被取代)。
答案 1 :(得分:1)
使用"translate_indicator('\$0', $batchId)"
代替'translate_indicator(\'$0\', {$batchId})'
。
答案 2 :(得分:1)
$batchId = 2345;
$code = 'AA1#';
$code = preg_replace(
"/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
"translate_indicator('\$0', $batchId)", /* if $batchId can be a string use 'batchId' */
$code);
function translate_indicator($s, $batchId) {
echo "translate_indicator($s, $batchId) invoked\n";
}
打印translate_indicator(AA1#, 2345) invoked
。
您还可以使用preg_replace_callback和类/对象
class Foo {
public $batchId = 2345;
public function translate_indicator($m) {
echo "batchId=$this->batchId . $m[0]\n";
}
}
$code = 'AA1#';
$foo = new Foo;
$code = preg_replace_callback(
'/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/',
array($foo, 'translate_indicator'),
$code
);
从php 5.3开始。您还可以使用anonymous function + closure“传递”其他参数。
$code = 'AA1#';
$batchId = 2345;
$code = preg_replace_callback(
'/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/',
function($m) use ($batchId) {
echo "batchid=$batchId . code=$m[0]\n";
},
$code
);