Dica: PHP Regex e UTF-8

Tiago Henrique
Sep 6, 2018 · 1 min read

Estava trabalhando com regex (expressões regulares) essa semana e me deparei com o seguinte problema:

<?php$texto = "CALÇA MASCULINA";
$q = "calça";
$matches = array();
preg_match("#{$q}#i", $texto, $matches);print_r($matches);

A intenção desse código é encontrar a palavra calça dentro do texto CALÇA MASCULINA. Porém, mesmo utilizando o modificador /i após o pattern(“#{$q}#i”), para que não diferenciar letras maiúsculas de minúsculas, o preg_match não consegue encontrar a palavra calça. Isso acontece porque o caractere ç é diferente do caractere Ç. O mesmo acontece para o caractere ã e à por exemplo.

Para resolver o "problema" do encoding, basta adicionar o modificador u após o pattern (“#{$q}#iu”):

<?php$texto = "CALÇA MASCULINA";
$q = "calça";
$matches = array();
preg_match("#{$q}#iu", $texto, $matches);print_r($matches);

Basicamente, o modificador /u aciona uma funcionalidade adicional de PCRE que é incompatível com Perl. As strings do nosso pattern são tratadas como UTF-8.

Vale lembrar que o modificador /u deve estar minúsculo, pois o /U é outro modificador.

Para mais detalhes sobre este e outros modificadores consulte a documentação do php: http://php.net/manual/pt_BR/reference.pcre.pattern.modifiers.php

Espero ter ajudado \o/
Até a próxima!

Tiago Henrique

Written by

Analista Desenvolvedor de Sistemas Web na Marknet desde 2012

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade