¿Cómo puedo convertir expresiones ereg a preg en PHP?

140

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_matchexpresiones 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:

netcoder
fuente
2
@ yes123: Sí, ese es el punto, también estoy cansado de eso. Quiero una publicación wiki que realmente explique algo para que podamos cerrar todas estas preguntas individuales.
netcoder
Creo que no hay necesidad de esto porque solo necesitas envolver lo viejo con un delimitador. También creo que podría haber usado una pregunta anterior para esto.
dinámico
Ah, voté por un cierre antes de leer los comentarios. Como marcador de posición, podría tener un propósito, pero ¿no hay otra pregunta anterior que podría haber servido como tal?
Escrito el
Hmm, de hecho. ereg [php]no produce resultados muy útiles. OK, puedo prestar mi apoyo a este.
Escrito el
8
Amigos, parece que casi hemos creado un círculo de preguntas cerradas sobre este tema, todas apuntadas entre sí. A este ritmo, todos estarán cerrados :)
Kev

Respuestas:

142

El mayor cambio en la sintaxis es la adición de delimitadores .

ereg('^hello', $str);
preg_match('/^hello/', $str);

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:

preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc

Si su delimitador se encuentra en la expresión regular, debe escapar de él:

ereg('^/hello', $str);
preg_match('/^\/hello/', $str);

Puede escapar fácilmente de todos los delimitadores y caracteres reservados en una cadena utilizando preg_quote :

$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);

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 :

eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');

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:

stripos($str, 'hello world') === 0
netcoder
fuente
2
Maravillosa explicación! Solo quisiera agregar un caso especial en el que está convirtiendo de ereg a preg_match y necesita escapar solo de los delimitadores y no caracteres reservados (porque ya estaban funcionando como caracteres especiales, no queremos escapar de ellos) : preg_match ('/'. str_replace ('/', '\ /', $ expr). '/', $ str);
Lolito
Vale la pena señalar que si usa corchetes coincidentes, entonces no necesita escapar de ningún carácter "solo porque es el mismo que el delimitador" como lo hace con otros símbolos como el /^\/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.
Niet the Dark Absol
¡Puedo decir que odio el PHP! (.. Así que nada más) Tengo que buscar estas respuestas cuando mi servidor de alojamiento web compartido se actualiza a una nueva versión y las error_logs se llenan con estas advertencias: PHP Deprecated: Function ereg() is deprecated in.... Argh!
c00000fd
¿Cómo convertir esto? $ regex = $ e. '((\. [^ \.'. $ e. '] [^'. $ e. '] *) | (\. \. [^'. $ e. '] +) | ([^ \. ] [^ '. $ e.'] *)) '. $ e. '\. \.' . $ e; a preg_math funciona haciendo simplemente agregando / modificador /
bdalina
32

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:

  1. Añadir delimitadores (/):'pattern' => '/pattern/'

  2. 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, '/') . '/';

  3. 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 /').

  4. 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.

Sumoanand
fuente
8

Desde PHP versión 5.3, eregestá en desuso.

Pasar de erega preg_matches solo un pequeño cambio en nuestro patrón.

Primero, debe agregar delimitadores a su código, por ejemplo:

ereg('A-Z0-9a-z', 'string');

a

preg_match('/A-Z0-9a-z/', 'string');

Para la eregicoincidencia entre mayúsculas y minúsculas, coloque idespués del último delimitador, por ejemplo:

eregi('pattern', 'string');

a

preg_match ('/pattern/i', 'string');
Narayan
fuente
7

Hay más diferencias entre ereg()y preg_replace()que solo la sintaxis:

  • Valor de retorno:

    • En caso de error : ambos regresanFALSE
    • En ningún partido : ereg()devoluciones FALSE, preg_match()devoluciones0
    • En coincidencia : ereg()devuelve la longitud de la cadena o 1, preg_match()siempre devuelve1
  • Matriz resultante de subcadenas coincidentes: si no se encuentra alguna subcadena ( (b)en ...a(b)?), el elemento correspondiente en el ereg()resultado será FALSE, mientras que en preg_match()él no se establecerá en absoluto.

Si uno no es lo suficientemente valiente como para convertir su ereg()a preg_match(), él o ella puede utilizar mb_ereg () , que todavía está disponible en PHP 7.

Roman Hocke
fuente