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!