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)