Pergunta sobre regex, php, preg-replace-callback – Uso de regex com preg_replace_callback

1

Eu gostaria de capitalizar a primeira letra de uma string que poderia ter caracteres especiais (essa é a razão pela qual a primeira não é válida aqui). Eu tenho o próximo 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 retorna 'éSta' mas 'Ésta' era esperado ... Eu acho que meu problema é o padrão que estou usando, mas eu fiz combinações diferentes (como$pattern = '/\pL/u') mas não encontro um bom regex. Alguém poderia me ajudar? Obrigado!

Sua resposta

1   a resposta
2

Isso é porque o seua-z não combina com é. Escrever um regex para incluir caracteres unicode pode ser difícil.

A partir do seu código, apenas a letra maiúscula será utilizada, independentemente da quantidade de palavras na sua string. Se sim, faça o seguinte:

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

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

omb_* funções devem manipular seus caracteres especiais corretamente.

Com base no seu comentário abaixo, eu entendo seu dilema. Nesse caso, você pode usar sua expressão regular, mas com os seletores unicode corretos

$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];
}
O código acima funcionará para¿"ésta eésta Elliot Chance
Muito obrigado, muito mesmo !! ;) jprog
Meu problema é que nem sempre é a primeira letra que tenho para capitalizar, porque minha string poderia ser algo como '¿"ésta"?' e eu quero que minha função retorne "¿" Ésta "? ' jprog

Perguntas relacionadas