2012-02-23 10 views
14
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

debe convertirse en:preg_replace con los reemplazos de matriz

Mary and Jane have apples. 

En este momento estoy haciendo de esta manera:

preg_match_all('/:(\w+)/', $string, $matches); 

foreach($matches[0] as $index => $match) 
    $string = str_replace($match, $replacements[$index], $string); 

¿Puedo hacer esto en una sola pasada, usando algo como preg_replace ?

+1

[Este] (http://codepad.org/KfP3g02m) es como se puede hacer con una matriz asociativa. – Teneff

Respuesta

10

Usted podría utilizar preg_replace_callback con una devolución de llamada que consume sus reemplazos, uno tras otro:

$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 
echo preg_replace_callback('/:\w+/', function($matches) use (&$replacements) { 
    return array_shift($replacements); 
}, $string); 

Salida:

Mary and Jane have apples. 
+0

el modificador e se ha depreciado a partir de PHP v.5.5 – Kareem

+1

@Karim: Correcto, lo he quitado de la respuesta. Gracias por el puntero. – hakre

8
$string = ":abc and :def have apples."; 
$replacements = array('Mary', 'Jane'); 

echo preg_replace("/:\\w+/e", 'array_shift($replacements)', $string); 

Salida:

Mary and Jane have apples. 
+0

¿Esto no funcionará en el HHVM? – Mario

3

Para una Multipl e y la sustitución completa gama de Asociativo clave se puede usar esto para que coincida con su patrón de expresión:

$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow"); 
    $source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ ... _animal_sound_ , _no_match_"; 


    function translate_arrays($source,$words){ 
    return (preg_replace_callback("/\b_(\w*)_\b/u", function($match) use ($words) { if(isset($words[$match[0]])){ return ($words[$match[0]]); }else{ return($match[0]); } }, $source)); 
    } 


    echo translate_arrays($source,$words); 
    //returns: Hello! My Animal is a cat and it says MEooow ... MEooow , _no_match_ 

* Aviso, eso aunque "_no_match_" carece de traducción, que coincidirá en expresiones regulares, pero preservar su llave. Y las llaves pueden repetirse muchas veces.

+0

Recomiendo agregar el modificador "u" a la expresión regular para admitir cadenas UTF-8: '/ \ b _ (\ w *) _ \ b/u'. Por cierto, el código anterior tiene un error de sintaxis y paréntesis adicionales al final. – nikoskip

+0

Parece que no hay un problema adicional de paréntesis, he verificado el código y está funcionando bien. BUt he agregado el UTf-8. Gracias – Miguel

Cuestiones relacionadas