una str_replace reemplazar preg_replace palabra limpiar eliminar delete caracteres cadena php regex preg-replace

str_replace - PHP preg_replace: coincidencia entre mayúsculas y minúsculas con un reemplazo sensible a las mayúsculas y minúsculas



strpos php (3)

Esta es la solución que utilicé:

$result = preg_replace("//b(foo)/b/i", "<strong>$1</strong>", $original);

En las mejores palabras que pueda, intentaré explicar por qué esto funciona: si ajusta su término de búsqueda con () significa que quiero acceder a este valor más adelante. Como es el primer elemento en pars en el RegEx, se puede acceder con $1 , como se puede ver en el parámetro de sustitución.

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 unir una palabra de una manera que no distingue entre mayúsculas y minúsculas, pero respete su caso cuando se reemplaza, dando el resultado ''pera pera''.

Lo siguiente funciona, pero me parece un poco largo aliento:

$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.


Puedes hacer esto con preg_replace_callback , pero eso es mucho 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 la capitalización del primer carácter de la partida para determinar con qué reemplazar; Podrías adaptar el código para hacer algo más complicado en su lugar.


Tengo en cuenta esta implementación para el caso común:

$data = ''this is appLe and ApPle''; $search = ''apple''; $replace = ''pear''; $data = preg_replace_callback(''//b''.$search.''/b/i'', function($matches) use ($replace) { $i=0; return join('''', array_map(function($char) use ($matches, &$i) { return ctype_lower($matches[0][$i++])?strtolower($char):strtoupper($char); }, str_split($replace))); }, $data); //var_dump($data); //"this is peaR and PeAr"

-Es más complicado, por supuesto, pero se ajusta a la solicitud original para cualquier posición. Si solo está buscando la primera letra, esto podría ser una exageración (vea la respuesta de @ Jon luego)