2012-03-03 13 views
13

He estado investigando preguntas similares, pero todavía estoy un poco confuso si es posible y/o la mejor manera de pasar argumentos adicionales en preg_replace_callback usando PHP 5.2.6Pasando argumentos adicionales a preg_replace_callback usando PHP 5.2.6

En este caso, también estoy buscando pasar la $ key del bucle foreach junto con la función if_replace.

public function output() { 
if (!file_exists($this->file)) { 
    return "Error loading template file ($this->file).<br />"; 
} 
$output = file_get_contents($this->file); 

foreach ($this->values as $key => $value) { 
    $tagToReplace = "[@$key]"; 
    $output = str_replace($tagToReplace, $value, $output); 
    $dynamic = preg_quote($key); 
    $pattern = '%\[if @'.$dynamic.'\](.*?)\[/if\]%'; // produces: %\[if @username\](.*?)\[/if\]% 
    $output = preg_replace_callback($pattern, array($this, 'if_replace'), $output); 
} 

return $output; 
} 



public function if_replace($matches) { 

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]); 
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]); 
    return $matches[0]; 
} 

Se pregunta si algo como esto funcionaría:

class Caller { 

public function if_replace($matches) { 

    $matches[0] = preg_replace("%\[if @username\]%", "", $matches[0]); 
    $matches[0] = preg_replace("%\[/if]%", "", $matches[0]); 
    return $matches[0]; 
} 

} 

$instance = new Caller; 

$output = preg_replace_callback($pattern, array($instance, 'if_replace'), $output); 
+0

La función Acallback es un cierre, puede pasar argumentos adicionales a través del uso, compruebe la respuesta en http://stackoverflow.com/questions/16445991/how-do-i-access-a-variable-inside-of-preg -replace-callback – Tester

Respuesta

28

Antes de PHP 5.3

Puede utilizar clase de ayuda:

class MyCallback { 
    private $key; 

    function __construct($key) { 
     $this->key = $key; 
    } 

    public function callback($matches) { 
     return sprintf('%s-%s', reset($matches), $this->key); 
    } 
} 

$output = 'abca'; 
$pattern = '/a/'; 
$key = 'key'; 
$callback = new MyCallback($key); 
$output = preg_replace_callback($pattern, array($callback, 'callback'), $output); 
print $output; //prints: a-keybca-key 

A partir de PHP 5.3

Puede utilizar la función anónima:

$output = 'abca'; 
$pattern = '/a/'; 
$key = 'key'; 
$output = preg_replace_callback($pattern, function ($matches) use($key) { 
      return sprintf('%s-%s', reset($matches), $key); 
     }, $output); 
print $output; //prints: a-keybca-key 
+0

Gracias, esto es exactamente lo que esperaba que fuera posible. Apreciar la muestra, está muy clara y pude adaptarla. – jsuissa

+1

Quien lo lea: es posible que desee utilizar la palabra clave "use" en lugar de este enfoque relativamente complejo (consulte [esta respuesta de @Mark Baker] (http://stackoverflow.com/a/16446110/722036) para obtener más información) –

+0

La respuesta en el comentario anterior de @TheSexiestManinJamaica ofrece una solución mucho mejor y más simple a este problema que agregar nuevas clases, etc. – Chris

2

Por desgracia no se puede. En PHP 5.3, simplemente podría usar un cierre para tener acceso a las variables que pasaría como parámetros.

En su caso, hay dos soluciones posibles: Una limpia y otra sucia.

El sucio está almacenando los parámetros en variables globales para que pueda acceder a ellos desde dentro de la devolución de llamada.

El limpio está creando una clase donde pase los parámetros, p. Ej. a través del constructor Luego usa array($instance, 'methodName') como devolución de llamada y simplemente acceda a los parámetros a través de $this->whatever dentro de su método.

+0

Gracias eso me lleva en la dirección correcta. Actualicé la pregunta en función de tu comentario, creo que entiendo lo que estás sugiriendo. – jsuissa

16
$pattern = ''; 
$foo = 'some text'; 

return preg_replace_callback($pattern, function($match) use($foo) 
{ 
var_dump($foo); 

}, $content); 
+2

funciona en php 5.3 – Bald

Cuestiones relacionadas