Pregunta sobre regex, php, preg-replace-callback – Uso de expresiones regulares con preg_replace_callback

1

Me gustaría poner en mayúscula la primera letra de una cadena que podría tener caracteres especiales (esa es la razón por la que ucfirst no es válida aquí) Tengo el siguiente código:

$string = 'ésta';
$pattern = '/^([^a-z]*)([a-z])/i';

$callback_fn = 'process';

echo preg_replace_callback($pattern, $callback_fn, $string);


function process($matches){
    return $matches[1].strtoupper($matches[2]);
}

que devuelve 'éSta' pero se esperaba 'Esto' ... Creo que mi problema es el patrón que estoy usando, pero he hecho diferentes combinaciones (como$pattern = '/\pL/u') pero no encuentro un buen regex. ¿Alguien podría ayudarme? ¡Gracias!

Tu respuesta

1   la respuesta
2

Esto es porque tua-z no coincidirá con é. Escribir una expresión regular para abarcar caracteres Unicode puede ser difícil.

Desde su código, solo pondrá en mayúscula la primera letra, independientemente de la cantidad de palabras en su cadena. Si es así, haz esto:

$string = 'ésta';
$ucstring = ucphrase($string);

function ucphrase($word) {
  return mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1);
}

losmb_* Las funciones deben manejar sus caracteres especiales correctamente.

Basado en su comentario a continuación entiendo su dilema. En ese caso, puede usar su expresión regular pero con los selectores Unicode correctos

$string = 'ésta';
$pattern = '/(\p{L})(.+)/iu';

$callback_fn = 'process';

echo preg_replace_callback($pattern, $callback_fn, $string);


function process($matches){
    return mb_strtoupper($matches[1], 'UTF-8') . $matches[2];
}
Mi problema es que no siempre es la primera letra con la que debo escribir, porque mi cadena podría ser algo así como "¿" esta "?" y quiero que mi función devuelva '¿"Esta"?' jprog
¡¡Muchas muchas gracias!! ;) jprog
El código de arriba funcionará para¿"ésta yésta Elliot Chance

Preguntas relacionadas