Pregunta

Python tiene esta maravillosa manera de manejar las sustituciones de cadenas usando diccionarios:

>>> 'The %(site)s site %(adj)s because it %(adj)s' % {'site':'Stackoverflow', 'adj':'rocks'}
'The Stackoverflow site rocks because it rocks'

Me encanta esto porque puedes especificar un valor una vez en el diccionario y luego reemplazarlo en todas partes de la cadena.

Intenté lograr algo similar en PHP usando varias funciones de reemplazo de cadenas, pero todo lo que se me ocurrió se siente incómodo.

¿Alguien tiene una manera limpia y agradable de realizar este tipo de sustitución de cadenas en PHP?

Editar
Aquí está el código de la página de sprintf que más me gustó.

<?php

function sprintf3($str, $vars, $char = '%')
{
    $tmp = array();
    foreach($vars as $k => $v)
    {
        $tmp[$char . $k . $char] = $v;
    }
    return str_replace(array_keys($tmp), array_values($tmp), $str);
}

echo sprintf3( 'The %site% site %adj% because it %adj%', array('site'=>'Stackoverflow', 'adj'=>'rocks'));
?>
¿Fue útil?

Solución

function subst($str, $dict){
    return preg_replace(array_map(create_function('$a', 'return "/%\\($a\\)s/";'), array_keys($dict)), array_values($dict), $str);
 }

Lo llamas así:

echo subst('The %(site)s site %(adj)s because it %(adj)s', array('site'=>'Stackoverflow', 'adj'=>'rocks'));

Otros consejos

@Mario

No sé si es más rápido, pero puedes hacerlo sin expresiones regulares:

function subst($str, $dict)
{
  foreach ($dict AS $key, $value)
  {
    $str = str_replace($key, $value, $str);
  }

  return $str;
}

Algunas de las notas y funciones aportadas por los usuarios en Documentación de PHP para sprintf acercarse bastante.

Nota:busque en la página "sprintf2".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top