Saltar al contenido

Reemplazar la primera ocurrencia de una cadena con PHP

php

Subo aquí estas funciones que nos pueden sacar de algún problemilla cuando tienes que reemplazar la primera ocurrencia de una cadena de texto.

Estaría muy útil que str_replace se le pudiese pasar por parámetro el número de coincidencias que quieres reemplazar, pero no , desgraciadamente solo se puede reemplazar todo o nada utilizando esta función.

La primera solución que encuentro es utilizar preg_replace , en esta función si que le puedes pasar la ocurrencia que quieres sustituir, en este caso reemplazamos solo la primera, sería así:


preg_replace($from, $to, $subject, 1);

Si lo quieres meter y llamar desde dentro de una función puedes hacerlo así:

function str_replace_first($from, $to, $subject)
{
    $from = '/'.preg_quote($from, '/').'/';
 
    return preg_replace($from, $to, $subject, 1);
}

Esta solución está guay, pero utiliza expresiones regex, si lo que quieres encontrar es una expresión simple entonces esta perfecto, metes tu texto dentro de barras laterales «/» y listo.

Ahora bien, si lo que quieres usar como string es una cadena con caracteres y alguno de estos caracteres es un caracter especial ya te obliga a conocer regex, ya que puede que no encuentres tu texto o que reemplaces otros textos que no tienen nada que ver, por ejemplo si buscas textos de este tipo «{*texto» .

Para lograr buscar cualquier cadena de texto sin tener que utilizar una expresión regex, utilizaremos la siguiente función:
php

$pos = strpos($haystack,$needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}

Si lo quieres meter y llamar desde dentro de una función puedes hacerlo así:

function str_replace_first($search, $replace, $subject) {
    $pos = strpos($subject, $search);
    if ($pos !== false) {
        return substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}

Y listo, con esto tenemos dos maneras para poder reemplazar la primera ocurrencia de una cadena, espero que te valga!