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.

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top