如何使用带有'e'修饰符的preg_replace()传递参数?

时间:2009-12-28 13:52:12

标签: 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);

我希望能够访问$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()

所以我认为使用这种方法传递参数是不可能的。:(

3 个答案:

答案 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
);