Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何用preg#u replace()和';e';修饰语?_Php_Regex - Fatal编程技术网

Php 如何用preg#u 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

我有一个关于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=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
);