PHP preg_replace: coincidencia insensible a mayúsculas y minúsculas con reemplazo sensible a mayúsculas y minúsculas

3 minutos de lectura

avatar de usuario
colin

Estoy usando preg_replace en PHP para buscar y reemplazar palabras específicas en una cadena, como esta:

$subject = "Apple apple";
print preg_replace('/\bapple\b/i', 'pear', $subject);

Lo que da el resultado ‘pera pera’.

Lo que me gustaría poder hacer es hacer coincidir una palabra sin distinguir entre mayúsculas y minúsculas, pero respetar su caso cuando se reemplaza, dando el resultado ‘Pera pera’.

Lo siguiente funciona, pero me parece un poco largo:

$pattern = array('/Apple\b/', '/apple\b/');
$replacement = array('Pear', 'pear');
$subject = "Apple apple";
print preg_replace($pattern, $replacement, $subject);

¿Hay una mejor manera de hacer esto?

Actualización: además de una excelente consulta planteada a continuación, para los fines de esta tarea solo quiero respetar el ‘caso del título’, por lo que si la primera letra de una palabra es mayúscula o no.

  • Lo único que no está claro: ¿qué pasa si la palabra original y la de reemplazo tienen una longitud diferente y la palabra original tiene una letra mayúscula en una posición más alta? Es decir 'applE' y 'pear' ¿entonces que?

    – Alma Do

    11/10/2013 a las 11:56

  • Excelente punto. Para los propósitos de esta tarea en particular, solo me gustaría respetar el ‘caso del título’ (es decir, si la primera letra es mayúscula o no). Muchas gracias por añadir más claridad.

    – colin

    11/10/2013 a las 11:59

avatar de usuario
Jon

Podrías hacer esto con preg_replace_callbackpero eso es aún más largo:

$replacer = function($matches) {
    return ctype_lower($matches[0][0]) ? 'pear' : 'Pear';
};

print preg_replace_callback('/\bapple\b/i', $replacer, $subject);

Este código solo observa las mayúsculas del primer carácter de la coincidencia para determinar con qué reemplazar; podría adaptar el código para hacer algo más complicado en su lugar.

  • Probé tu código, pero obtengo un error fatal atrapable: el objeto de la clase Closure no se pudo convertir en una cadena…

    – c3cris

    17 de enero de 2016 a las 14:03

  • @c3cris había escrito por error solo preg_replace en vez de preg_replace_callback en el fragmento anterior, aunque la mención en la primera línea era correcta. Reparado.

    – Jon

    17 de enero de 2016 a las 22:24

  • Esta es una solución mucho más elegante. Mucho más corto y sencillo de entender de un vistazo. +1

    – JustCarty

    9 mayo 2017 a las 12:00

  • Y mira la diferencia entre eso y la respuesta esperada. Un gran recordatorio para todos los ingenieros de “mantenerlo simple”.

    usuario5132647

    28/10/2017 a las 20:08

  • Esta respuesta no proporciona el resultado/funcionalidad esperado.

    – mickmackusa

    22 de agosto de 2019 a las 11:11

  • ¡Tan sencillo! ¿Cómo me había olvidado de las referencias anteriores? ¡Gracias!

    – sdlins

    3 de enero de 2020 a las 4:13

  • ¿Es $1 o $0?

    –Federico González Brizzio

    8 de noviembre de 2021 a las 19:31

avatar de usuario
Pablo Chris Jones

$text="Grey, grey and grey";
$text = Find_and_replace_in_lowercase_and_uppercase('grey', 'gray', $text);
echo $text; //Returns 'Gray, gray and gray'

function Find_and_replace_in_lowercase_and_uppercase($find_term, $replace_term, $text)
{
        $text = Find_and_replace_in_lowercase($find_term, $replace_term, $text);
        $text = Find_and_replace_in_uppercase($find_term, $replace_term, $text);
        return $text;

}
function Find_and_replace_in_lowercase($find_term, $replace_term, $text)
{
        $find_term = lcfirst($find_term);
        $replace_term = lcfirst($replace_term);
        $text = preg_replace("/$find_term/",$replace_term,$text);
        return $text;
}
function Find_and_replace_in_uppercase($find_term, $replace_term, $text)
{
        $find_term = ucfirst($find_term);
        $replace_term = ucfirst($replace_term);
        $text = preg_replace("/$find_term/",$replace_term,$text);
        return $text;
}

¿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