Php 如何用preg#u replace()和';e';修饰语?
我有一个关于preg_replace()函数的问题。我用的是“e”修饰语。下面是代码片段:Php 如何用preg#u replace()和';e';修饰语?,php,regex,Php,Regex,我有一个关于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); 我想访问translate\u指示器($code$batch
$batchId = 2345;
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
'translate_indicator(\'$0\', {$batchId})', $code);
我想访问translate\u指示器($code$batch=false)
函数中的$batchId
变量。不幸的是,上述示例无法正常工作:$batch在translate\u indicator()中不可见(var\u dump()
结果为bool(false)
)
可能,我在替换代码中有语法错误。或者,可能无法使用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\u indicator()
中$batch的默认值。结果:
Warning: Missing argument 2 for translate_indicator()
所以我认为用这种方法传递参数是不可能的。(试试这个
$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\u指示符(\$0',$batchId)”
而不是“translate\u指示符(\'$0',{$batchId})”
打印调用的翻译指示器(AA1,2345)
您还可以使用和类/对象
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
);
从PHP5.3开始,您还可以使用“传递”附加参数
$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
);
顺便说一句,我用
translate\u指示符($a,$b)
作为伪函数(var\u dump
)尝试了你的preg\u replace()
代码,一切都很好。你使用的是什么php版本?我发现了preg\u replace\u回调()更适合我。但非常感谢你的评论。我对问题的更新是错误的,因为我刚才提到,我没有像你写的那样将“\”放在美元符号之前。所以我得到了“$0”而不是“\$0”。我没有注意到这一点。这就是我得到警告的原因。好吧,我只是建议你使用preg\u replace\u callback()。这是一个更安全的解决方案,因为在匹配的字符串中转义字符串文字时不会出现问题,例如“
或”
。我想它的性能也更高。
$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
);