Reemplazo múltiple (probablemente preg_replace) de la misma cadena con matriz

2 minutos de lectura

Necesito reemplazar varias instancias de una determinada cadena (signo de interrogación) con cadenas de una matriz. por ejemplo, si la cadena que deseo reemplazar aparece 3 veces y mi matriz tiene una longitud de 3, la primera se reemplazaría por el primer elemento de la matriz, la segunda por el segundo, etc.

Puede reconocer que es bastante similar a la forma en que funcionan las declaraciones preparadas en mysqli.

Aquí hay un ejemplo:

$myArray = array(
    [0] => 'yellow',
    [1] => 'green',
    [2] => 'red'
);

$myString = 'banana is ?, apple is ?, tomato is ?';

$newString = someFunction($myString,$myArray);

echo $newString;

Esto luego volvería

banana is yellow, apple is green, tomato is red

¿Alguien puede sugerir una forma de hacer esto usando PHP 5.2?

por qué no usar

$retString = vsprintf('banana is %s, apple is %s, tomato is %s', $myArray);  
return $retString;

  • Hmm, me olvidé por completo de sprintf (es una de esas funciones que nunca he usado por alguna razón). Eso realmente funcionaría muy bien, aunque en mi caso necesito usar signos de interrogación, así que tendré que reemplazarlos, pero de hecho, para mi caso particular, funcionará bien. Solución aceptada, muchas gracias.

    – robo

    29 de enero de 2010 a las 11:55

  • bueno, si está haciendo un reemplazo simple, siempre puede hacer algo como str_replace($str, '?', '$s'); 🙂 Me alegro de haber ayudado.

    – Beso de Adán

    29 de enero de 2010 a las 11:57

  • Vale la pena señalar que sprintf puede escribir sus datos de forma segura por usted.

    – Corey Ballou

    29 de enero de 2010 a las 11:57

  • si por alguna razón tiene que usar signos de interrogación, reemplácelos primero. Algo como $str=preg_replace('/([^\\\\]|^)\?/', '%s',$str); también maneja los signos de interrogación citados.

    – gnud

    29 de enero de 2010 a las 12:06

Se pone un poco feo en PHP 5.2 porque tiene que usar variables globales para pasar información entre devoluciones de llamada, pero de lo contrario es muy flexible. Usar preg_replace_callback():

preg_replace_callback('!\?!', 'rep_array', $myString);

$i = 0;

function rep_array($matches) {
  global $myArray;
  return $myArray[$i++];
}

Tendrías que atender que haya más ?s que las entradas de la matriz, así como restablecer el contador con cada llamada.

Adán tiene razón sobre sprintf() siendo algo más limpio pero no siempre controlas la cadena de entrada. preg_replace_callback puede atender a una gama mucho más amplia de circunstancias.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad