() 'E' değiştirici ile preg_replace ile parametre geçmek için?

3 Cevap php

Ben preg_replace () işlevi hakkında bir sorum var. Ben 'e' değiştirici ile kullanıyorum. İşte kod parçacığını:

$batchId = 2345;
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
                     'translate_indicator(\'$0\', {$batchId})', $code);

I translate_indicator($code, $batch=false) işlev içinde $batchId değişkene erişmek istiyorum. Yukarıdaki exapmle, ne yazık ki, düzgün çalışmaz: $ toplu görünmez (var_dump() sonucu bool(false)) içinde translate_indicator().

Muhtemelen, ben yedek kod hataları sözdizimi var. Ya da, belki, bu preg_replace() ile değişkenler geçmek imkansız?

Update for the first two answers.

Cevaplar için teşekkür ederim, ama tavsiye yardım etmedi. Zaten çift qoutes yerine tek qoutes denedim yanında. Ben sadece işleve parametre geçme olasılığını test etmek için kod basitleştirilmiş ettik:

$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
                     "translate_indicator('$0', 12)", $code);

Ayrıca ben translate_indicator() içinde $ parti için varsayılan değer kaldırdık. Sonuç:

Warning: Missing argument 2 for translate_indicator()

Yani bu yaklaşımı kullanarak parametreyi geçmek imkansız olduğunu düşünüyorum:. (

3 Cevap

$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";
}

prints translate_indicator(AA1#, 2345) invoked.
You can also use preg_replace_callback and a class/an object

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 gibi. Aynı zamanda bir anonymous function + closure ek bir parametre "geçmek" için kullanabilirsiniz.

$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
);

Bunun yerine bu deneyin

$batchId = 2345;
$code = preg_replace("/[A-Za-z]{2,4}[\d\_]{1,5}[\.YRCc]{0,4}[\#\&\@\^]{0,2}/e",
                     "translate_indicator('$0', {$batchId})", $code);

tek başına alıntılanan dizeleri (yani $ BatchID ikame olmayacak) genişletilmiş değildir.

"translate_indicator('\$0', $batchId)" yerine 'translate_indicator(\'$0\', {$batchId})' arasında kullanın.