Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: westwest en 01 de Febrero de 2010, 16:55:31 pm
-
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 (http://www.phperos.net/foro/index.php/topic,4423.0.html) 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('\\[b\\](.*)\\[/b\\]', '<b>\\1</b>', $texto);
// POSIX
preg_replace('/\[b\](.*)\[\/b\]', '<b>\\1</b>', $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('/^hola$/', $var);
// hola validaría, pero HOLA, Hola, hOla, HOla... no validarían
$preg2 = preg_match('/^hola$/i', $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('/\[b\](.*)\[\/b\]/Usi', '<b>\\1</b>', $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('/\[quote\](.*)\[\/quote\]/Uis', '<b>\\1</b>', $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?:
Al que dijo:
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
-
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?.
-
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.
-
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
-
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
-
Buen aporte :)
K+
-
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('numero[0-9]+', 'número: \\1', $texto);
// POSIX
preg_replace('/numero[0-9]+/', número: 1', $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('numero[0-9]+', 'número: \\1', $texto);
// POSIX
preg_replace('/numero[0-9]+/', 'número: 1', $texto);
saludos!
-
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('numero[0-9]+', 'número: \\1', $texto);
// POSIX
preg_replace('/numero[0-9]+/', número: 1', $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('numero[0-9]+', 'número: \\1', $texto);
// POSIX
preg_replace('/numero[0-9]+/', 'número: 1', $texto);
saludos!
Con esto ya se va tirando, luego quien quiera profundizar...
Ahora corrijo lo de la comilla
-
Bueno info (+).
Como haz dicho en PHP 6 dejará de existir eregi, así que una alternativa puede ser stripos.
Saludos,
-
El titulo correcto debería ser pasar de POSIX Regex a PCRE