As expressões regulares vêm com todos os tipos de peculiaridades, uma das quais encontrei recentemente ao criar uma regex no PHP e preg_match
. Eu estava tentando analisar cadeias de caracteres com o formato “Real Name (:username)” quando me deparei com um problema que eu via muito na Mozilla: minha expressão regular não estava capturando corretamente letras “especiais” ou “internacionais”, como à, é, ü e dezenas de outras.
Minha expressão regular estava usando A-z
na parte de correspondência de nome real da regex, que eu presumi que corresponderia a letras especiais, mas isso não aconteceu:
preg_match( "/([A-Za-z -]+)?\s?\[?\(?:([A-Za-z0-9\-\_]+)\)?\]?/", "Yep Nopé [:ynope]", $matches); // 0 => '[:ynope]', 1 => 'Yep Nopé', 2 => 'ynope'
Para corresponder às letras internacionais, precisei atualizar minha expressão regular de duas maneiras:
- Alterar
A-z
para\pL
dentro da peça correspondente - Adicione o
u
faz com que a string seja tratada como UTF-8
O regex atualizado seria:
preg_match( "/([\pL -]+)?\s?\[?\(?:([\pL0-9\-\_]+)\)?\]?/u", "Yep Nopé [:ynope]", $matches); // 0 => 'Yep Nopé [:ynope]', 1 => 'Yep Nopé', 2 => 'ynope'
O senhor pode ver minha cama de teste simples aqui. Se o senhor tem medo de que outros personagens possam se infiltrar, ou não confia no \pL
, o senhor pode listar cada letra especial manualmente (ou seja, o [A-zàáâä....]
)
Uma das partes agradáveis de trabalhar em uma organização verdadeiramente global como a Mozilla é que estou exposto a muitos casos extremos; neste caso, algumas letras especiais!