O PHP Preg_Functions multibyte é seguro?
-
21-09-2019 - |
Pergunta
Não existem funções multibyte 'Preg' disponíveis no PHP, o que significa que as concunções preg_fault são todas seguras para MB? Não foi possível encontrar nenhuma menção na documentação do PHP.
Solução
O PCRE pode suportar o UTF-8 e outras codificações do Unicode, mas deve ser especificado no horário de compilação. De Página do homem para PCRE 8.0:
A implementação atual do PCRE corresponde aproximadamente com o Perl 5.10, incluindo suporte para seqüências codificadas UTF-8 e propriedades de categoria geral Unicode. No entanto, o suporte UTF-8 e Unicode deve ser explicitamente ativado; não é o padrão. As tabelas Unicode correspondem ao Unicode Release 5.1.
PHP atualmente usa PCRE 7.9; Seu sistema pode ter uma versão mais antiga.
Dando uma olhada no Pcre lib Isso vem com o PHP 5.2, parece que está configurado para oferecer suporte ao Unicode Properties e UTF-8. O mesmo para o 5.3 Braia.
Outras dicas
O PCRE suporta UTF8 fora da caixa, consulte a documentação para o modificador 'U'.
Ilustração ( xc3 xa4 é a codificação UTF8 para a carta alemã "ä")
echo preg_replace('~\w~', '@', "a\xC3\xA4b");
Isso ecoa "@@ ¤@" porque " xc3" e " xa4" foram tratados como símbolos distintos
echo preg_replace('~\w~u', '@', "a\xC3\xA4b");
(Observe que o 'u') imprime "@@@" porque " xc3 xa4" foram tratados como uma única letra.
Não, eles não são. Veja a pergunta preg_match e UTF-8 em PHP por exemplo.
Não, você precisa usar o Funções de string multibyte Curti mb_ereg
Algumas das minhas funções Preg mais complicadas:
(1A) Validar o nome de usuário como alfanumérico + sublinhamento:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/',$username)
(1b) Possível alternativa UTF:
preg_match('/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/u',$username)
(2a) Validar email:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix",$email))
(2b) possível alternativa UTF:
preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ixu",$email))
(3a) Normalize as novas linhas:
preg_replace("/(\n){2,}/","\n\n",$str);
(3b) Possível alternativa UTF:
preg_replace("/(\n){2,}/u","\n\n",$str);
Essas mudanças parecem bem?