Dado que las expresiones regulares POSIX (ereg) están en desuso desde PHP 5.3.0, me gustaría conocer una manera fácil de convertir las expresiones antiguas a PCRE (expresiones regulares compatibles con Perl) (preg) .
Por ejemplo, tengo esta expresión regular:
eregi('^hello world');
¿Cómo puedo traducir expresiones en preg_match
expresiones compatibles?
Nota: Esta publicación sirve como marcador de posición para todas las publicaciones relacionadas con la conversión de ereg a preg, y como opciones duplicadas para preguntas relacionadas. Por favor no cierre esta pregunta.
Relacionado:
php
preg-replace
preg-match
pcre
ereg
netcoder
fuente
fuente
ereg [php]
no produce resultados muy útiles. OK, puedo prestar mi apoyo a este.Respuestas:
El mayor cambio en la sintaxis es la adición de delimitadores .
Los delimitadores pueden ser prácticamente cualquier cosa que no sea alfanumérica, una barra diagonal inversa o un espacio en blanco. Los más utilizados son generalmente
~
,/
y#
.También puede usar paréntesis a juego:
Si su delimitador se encuentra en la expresión regular, debe escapar de él:
Puede escapar fácilmente de todos los delimitadores y caracteres reservados en una cadena utilizando preg_quote :
Además, PCRE admite modificadores para varias cosas. Uno de los más utilizados es el modificador sin distinción entre mayúsculas y minúsculas
i
, la alternativa a eregi :Puede encontrar la referencia completa a la sintaxis PCRE en PHP en el manual , así como una lista de diferencias entre la expresión regular POSIX y PCRE para ayudar a convertir la expresión.
Sin embargo, en su ejemplo simple no usaría una expresión regular:
fuente
/^\/hello/
ejemplo.(a(b)c)
es un PCRE delimitado perfectamente válido. Personalmente, me gusta usar paréntesis()
para recordarme que la primera coincidencia capturada es todo.error_log
s se llenan con estas advertencias:PHP Deprecated: Function ereg() is deprecated in...
. Argh!El reemplazo de Ereg con preg (a partir de PHP 5.3.0) fue un movimiento correcto a nuestro favor.
preg_match, que utiliza una sintaxis de expresión regular compatible con Perl, a menudo es una alternativa más rápida que ereg.
Debe saber 4 cosas principales para portar patrones ereg a preg:
Añadir delimitadores (/):
'pattern' => '/pattern/'
Delimitador de escape si es parte del patrón:
'patt/ern' => '/patt\/ern/'
Consíguelo programáticamente de la siguiente manera:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi (coincidencia entre mayúsculas y minúsculas): por lo
'pattern' => '/pattern/i'
tanto, si está utilizando la función eregi para la coincidencia entre mayúsculas y minúsculas, simplemente agregue 'i' al final del nuevo patrón ('/ patrón /').Valores ASCII : en ereg, si usa un número en el patrón, se supone que se refiere al ASCII de un carácter. Pero en preg, el número no se trata como valor ASCII. Entonces, si su patrón contiene un valor ASCII en la expresión ereg (por ejemplo: nueva línea, pestañas, etc.), conviértalo a hexadecimal y prefijelo con \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
fuente
Desde PHP versión 5.3,
ereg
está en desuso.Pasar de
ereg
apreg_match
es solo un pequeño cambio en nuestro patrón.Primero, debe agregar delimitadores a su código, por ejemplo:
a
Para la
eregi
coincidencia entre mayúsculas y minúsculas, coloquei
después del último delimitador, por ejemplo:a
fuente
Hay más diferencias entre
ereg()
ypreg_replace()
que solo la sintaxis:Valor de retorno:
FALSE
ereg()
devolucionesFALSE
,preg_match()
devoluciones0
ereg()
devuelve la longitud de la cadena o1
,preg_match()
siempre devuelve1
Matriz resultante de subcadenas coincidentes: si no se encuentra alguna subcadena (
(b)
en...a(b)?
), el elemento correspondiente en elereg()
resultado seráFALSE
, mientras que enpreg_match()
él no se establecerá en absoluto.Si uno no es lo suficientemente valiente como para convertir su
ereg()
apreg_match()
, él o ella puede utilizar mb_ereg () , que todavía está disponible en PHP 7.fuente