Autor Tema: [EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]  (Leído 1699 veces)

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Para los que no sepan que es REGEX o POSIX, ambas son "expresiones regulares", no se como explicarlo. A mi entender, son una serie de "reglas" para crear expresiones que validen textos no exactos (EMails, fechas...)

Lo básico sobre REGEX (las expresiones regulares de toda la vida xD) lo podeis encontrar en este tuto de Focux.

Antes que nada, ¿Porqué pasar a POSIX?
Quizás algunos lo sepais, pero para los que no...
En PHP 6 REGEX pasará a la historia, funciones como ereg(i), ereg(i)_replace (las que creo que más útiles pueden ser a este nivel, o las únicas que conozco xD) dejarán de funcionar.

En su lugar habrá que usar preg_match como ereg(i) y preg_replace en lugar de ereg(i)_replace.

Habréis notado que las funciones REGEX tienen una (i), eso es porque existe ereg y eregi, y ereg_replace y eregi_replace; según son case-sensitive (distingue mayusculas y minusculas) o no.
En POSIX no hacen falta funciones extras, ahora verás porqué :P

Ahora, el como...
POSIX en el fondo (y en la superficie) es REGEX... con unas pocas diferencias
1º: Caracteres de principio y fin.
En POSIX la expresión debe tener una / al principio y al final (creo que se puede hacer con otros caracteres, lo he visto con @ o.O).

// Esto reemplazaría "numeroX" por "número: X", es una función algo inútil, pero es un ejemplo...
// REGEX
ereg_replace('numero[0-9]+', 'número: \\1', $texto);
// POSIX
preg_replace('/numero[0-9]+/', 'número: \\1', $texto);

Observa que es identica, incluida la sustitución (\\1, \\2, \\N), excepto por las barras.
2º: Escape
Cuando usamos algún caracter reservado (en un BBCode, los [ y ], por ejemplo) debemos escaparlo...
En REGEX se ponen dos barras inclinadas, en POSIX solo 1.
Cabe destacar, que en POSIX la barra inclinada hay que escaparla...

// (.*) indica cualquier texto...
// REGEX
ereg_replace(&#39;\\[b\\](.*)\\[/b\\]&#39;, &#39;<b>\\1</b>&#39;, $texto);
// POSIX
preg_replace(&#39;/\[b\](.*)\[\/b\]&#39;, &#39;<b>\\1</b>&#39;, $texto);


Basicamente, ya puedes pasar de REGEX a POSIX y ser válido en PHP6
Pero, en REGEX yo uso eregi para que no distinga entre mayusculas y minusculas, ¿Cómo lo hago?

Usando las flags (banderas), pero no las confundais con parametros de la función, estas flags van en la expresión propiamente dicha, detras del último /
Cómo no estoy muy adentrado en este tema, conozco 3, y si es que hay más, no se su función...

NOTA: Esto está algo mal, así que mañana con tiempo lo pondré bien

i -> Para hacerlo insensible a mayusculas y minusculas

$preg1 
preg_match(&#39;/^hola$/&#39;, $var);
// hola validaría, pero HOLA, Hola, hOla, HOla... no validarían
$preg2 preg_match(&#39;/^hola$/i&#39;, $var);
// hola validaría, y también HOLA, Hola...

Usi -> No se como explicarlo, digamos que toma lo primero que encuentra, además lo vuelve insensible, algo así:
$preg preg_replace(&#39;/\[b\](.*)\[\/b\]/Usi&#39;, &#39;<b>\\1</b>&#39;, $texto);
El texto "Hola [*b]que tal?[/b*], yo muy bien [*b]^^[/b*] (Sin asteriscos)
Lo convertiría a:
Hola que tal?, yo muy bien ^^

Uis -> Cómo el anterior, pero anidado, es decir, coge primero y último:
$preg preg_replace(&#39;/\[quote\](.*)\[\/quote\]/Uis&#39;, &#39;<b>\\1</b>&#39;, $texto);
El texto "¿Porqué dijiste esto?:
[quote*]
Al que dijo:
[quote*]Tonto el que lo lea[/quote*]
¿Dónde leíste eso para aprenderlo? :P
[/quote*]
Lo convertiría a:
¿Porqué dijiste esto?:
Citar
Al que dijo:
Citar
Tonto el que lo lea
¿Dónde leíste eso para aprenderlo? :P

Espero que os halla quedado claro y os sea útil ^^

Salu2.

Más información: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
« Última modificación: 20 de Febrero de 2010, 23:24:14 pm por westwest »

Comunidad PHPeros


Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #1 en: 01 de Febrero de 2010, 17:17:34 pm »
Muy bueno West. Osea por que lo he entendido, las funciones ereg(i)_replace y ereg(i), pasarán a la historia y este es lo que le remplazará. Muchas gracias west. Te doi un karma + :D

¿Str_replace también dejará de existir en PHP 6?.

#Fdo. Physlet

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #2 en: 01 de Febrero de 2010, 17:35:25 pm »
Muy bueno West. Osea por que lo he entendido, las funciones ereg(i)_replace y ereg(i), pasarán a la historia y este es lo que le remplazará. Muchas gracias west. Te doi un karma + :D

¿Str_replace también dejará de existir en PHP 6?.
Gracias ^^
Respecto a str_replace, creo que no, porque no usa expresiones regulares.

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #3 en: 01 de Febrero de 2010, 17:36:40 pm »
Gracias ^^
Respecto a str_replace, creo que no, porque no usa expresiones regulares.

Vale muchas gracias. Voi a documentarme sobre esto de PHP 6 y POO que voi un poco mal. Jejeje

#Fdo. Physlet

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #4 en: 01 de Febrero de 2010, 17:54:36 pm »
Realmente no sé que más cambiará en PHP6, pero espero que no sea mucho :P

Por si alguien quiere más información, en:
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
Hay un manual detallado sobre esto, yo me lo estudiaré :P

Desconectado тockηick

  • PHPero Avanzado
  • ****
  • Mensajes: 374
  • Karma: 11
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #5 en: 20 de Febrero de 2010, 12:33:47 pm »
Buen aporte :)

K+

Desconectado Rodrinete

  • PHPer@ Fijo
  • ***
  • Mensajes: 222
  • Karma: 6
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #6 en: 20 de Febrero de 2010, 23:16:05 pm »
Buen aporte, yo creo que debias haber explicado algun detallito mas, pero bueno asi esta bien.

Y una cosa, aqui

// Esto reemplazaría "numeroX" por "número: X", es una función algo inútil, pero es un ejemplo...
// REGEX
ereg_replace(&#39;numero[0-9]+&#39;, &#39;n&uacute;mero: \\1&#39;, $texto);
// POSIX
preg_replace(&#39;/numero[0-9]+/&#39;, n&uacute;mero: 1&#39;, $texto);


Le falta un ' al segundo, seria asi.


// Esto reemplazaría "numeroX" por "número: X", es una función algo inútil, pero es un ejemplo...
// REGEX
ereg_replace(&#39;numero[0-9]+&#39;, &#39;n&uacute;mero: \\1&#39;, $texto);
// POSIX
preg_replace(&#39;/numero[0-9]+/&#39;, &#39;n&uacute;mero: 1&#39;, $texto);


saludos!

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #7 en: 20 de Febrero de 2010, 23:23:20 pm »
Buen aporte, yo creo que debias haber explicado algun detallito mas, pero bueno asi esta bien.

Y una cosa, aqui

// Esto reemplazaría "numeroX" por "número: X", es una función algo inútil, pero es un ejemplo...
// REGEX
ereg_replace(&#39;numero[0-9]+&#39;, &#39;n&uacute;mero: \\1&#39;, $texto);
// POSIX
preg_replace(&#39;/numero[0-9]+/&#39;, n&uacute;mero: 1&#39;, $texto);


Le falta un ' al segundo, seria asi.


// Esto reemplazaría "numeroX" por "número: X", es una función algo inútil, pero es un ejemplo...
// REGEX
ereg_replace(&#39;numero[0-9]+&#39;, &#39;n&uacute;mero: \\1&#39;, $texto);
// POSIX
preg_replace(&#39;/numero[0-9]+/&#39;, &#39;n&uacute;mero: 1&#39;, $texto);


saludos!
Con esto ya se va tirando, luego quien quiera profundizar...
Ahora corrijo lo de la comilla

Desconectado Revancha

  • PHPero Avanzado
  • ****
  • Mensajes: 375
  • Karma: 22
  • Sexo: Masculino
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #8 en: 22 de Febrero de 2010, 15:42:43 pm »
Bueno info (+).

Como haz dicho en PHP 6 dejará de existir eregi, así que una alternativa puede ser stripos.

Saludos,

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[EXPLICACION] Cómo y porqué pasar de REGEX a POSIX [Expresiones regulares]
« Respuesta #9 en: 29 de Mayo de 2010, 21:50:41 pm »
El titulo correcto debería ser pasar de POSIX Regex a PCRE
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>