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-zpara\pLdentro da peça correspondente - Adicione o
ufaz 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!