Como as expressões regulares POSIX (ereg) estão obsoletas desde o PHP 5.3.0, eu gostaria de saber uma maneira fácil de converter as expressões antigas em PCRE (Expressões regulares compatíveis com Perl) (preg) .
Por exemplo, eu tenho essa expressão regular:
eregi('^hello world');
Como posso traduzir expressões em preg_match
expressões compatíveis?
Nota: esta postagem serve como um espaço reservado para todas as postagens relacionadas à conversão de ereg para preg e como opções duplicadas para perguntas relacionadas. Por favor, não feche esta pergunta.
Palavras-chave:
php
preg-replace
preg-match
pcre
ereg
codificador de rede
fonte
fonte
ereg [php]
não produz resultados muito úteis. OK, posso dar meu apoio a este.Respostas:
A maior mudança na sintaxe é a adição de delimitadores .
Os delimitadores podem ser praticamente qualquer coisa que não seja alfanumérica, uma barra invertida ou um caractere de espaço em branco. Os mais utilizados são geralmente
~
,/
e#
.Você também pode usar colchetes correspondentes:
Se o seu delimitador for encontrado na expressão regular, você deverá escapar dele:
Você pode escapar facilmente de todos os delimitadores e caracteres reservados em uma string usando preg_quote :
Além disso, o PCRE suporta modificadores para várias coisas. Um dos mais utilizados é o modificador
i
que não diferencia maiúsculas de minúsculas , a alternativa ao eregi. :Você pode encontrar a referência completa à sintaxe PCRE no PHP no manual , bem como uma lista de diferenças entre o POSIX regex e o PCRE para ajudar a converter a expressão.
No entanto, no seu exemplo simples, você não usaria uma expressão regular:
fonte
/^\/hello/
exemplo.(a(b)c)
é um PCRE delimitado, perfeitamente válido. Pessoalmente, gosto de usar parênteses()
para me lembrar que a primeira partida capturada é a coisa toda.error_log
s se completa com estas advertências:PHP Deprecated: Function ereg() is deprecated in...
. Argh!A substituição de Ereg por preg (a partir do PHP 5.3.0) foi a jogada certa a nosso favor.
preg_match, que usa uma sintaxe de expressão regular compatível com Perl, geralmente é uma alternativa mais rápida ao ereg.
Você deve conhecer quatro coisas principais para portar padrões ereg para preg:
Adicione delimitadores (/):
'pattern' => '/pattern/'
Delimitador de escape se fizer parte do padrão:
'patt/ern' => '/patt\/ern/'
obtenha-o programaticamente da seguinte maneira:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi (correspondência sem distinção entre maiúsculas e minúsculas):
'pattern' => '/pattern/i'
Portanto, se você estiver usando a função eregi para correspondência sem distinção entre maiúsculas e minúsculas, basta adicionar 'i' no final do novo padrão ('/ pattern /').Valores ASCII : Em geral, se você usar número no padrão, presume-se que você esteja se referindo ao ASCII de um caractere. Mas em preg, o número não é tratado como valor ASCII. Portanto, se seu padrão contiver valor ASCII na expressão ereg (por exemplo: nova linha, tabulações etc.), converta-o em hexadecimal e prefixe-o com \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
fonte
Do PHP versão 5.3,
ereg
está obsoleto.Passar de
ereg
parapreg_match
é apenas uma pequena mudança em nosso padrão.Primeiro, você precisa adicionar delimitadores ao seu código, por exemplo:
para
Para
eregi
correspondência sem distinção entre maiúsculas e minúsculas, coloquei
após o último delimitador, por exemplo:para
fonte
Existem mais diferenças entre
ereg()
epreg_replace()
além da sintaxe:Valor de retorno:
FALSE
ereg()
retornosFALSE
,preg_match()
retornos0
ereg()
retorna o comprimento da string ou1
,preg_match()
sempre retorna1
Matriz resultante de substrings correspondentes: Se alguma substring não for encontrada (
(b)
in...a(b)?
), o item correspondente noereg()
resultado seráFALSE
, enquanto o itempreg_match()
não será definido.Se um não é corajoso o suficiente para converter o seu
ereg()
parapreg_match()
, ele ou ela pode usar mb_ereg () , que ainda está disponível no PHP 7.fonte