Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: egyware en 11 Febrero 2010, 23:30 pm



Título: Problema con expresión regular
Publicado por: egyware en 11 Febrero 2010, 23:30 pm
Hola a todos
estoy haciendo una expresion regular que no me funciona bien del todo
esta es

Código
  1. $expresion = '/\/(.*?)#/';
Esta es la expresión, (buscando en internet logre hacer esta expresion regular)
que extrae el contenido /algo# pero al combinarlo con otras expresiones regulares como BBCode me detecta otras cosas que no debe ser como el cierre de un tag html
mi duda es que si me pueden decir como NO incluir el ']', '>' y el espacio ya que me causa varios problemas
Saludos
gracias por su tiempo


Título: Re: Problema con expresión regular
Publicado por: ~ Yoya ~ en 11 Febrero 2010, 23:33 pm
Ok, no entendi muy bien, escribe lo que quieres sacar en un :
Código:
Aqui


Título: Re: Problema con expresión regular
Publicado por: egyware en 11 Febrero 2010, 23:49 pm
Este es el texto por ejemplo

Código:
Hola [b]Mundo[/b] /omg#
Deberia usando las las expresiones regulares quedar algo asi
Código:
Hola <strong>Mundo</strong> <img src="omg.gif" />

Pero con el actual codigo que tengo me sale algo asi
Código:
Hola [b]Mundo[<img src="b] /omg.gif"> 
Bueno no entendi ese "aqui" asi que puse un ejemplo, mi idea es que mi expresion regular no tome en cuenta ni el espacio ni el ] o >
Gracias
Saludos


Título: Re: Problema con expresión regular
Publicado por: raul338 en 11 Febrero 2010, 23:54 pm
Mis problemas favoritos ;-)

Bueno, a tu parecer solo queres capturar valores alfanumericos? (numeros y letras) entonces es \w

Si NO queres aceptar ciertos valores, se hace con un ^ al principio del corchete, ej: [^....]

Entonces te quedaria:
Código:
$expresion = '/\/(\w*)?#/';

o sino
Código:
$expresion = '/\/([^\s\[\]...]*)?#/';

(Ojo, todo esto lo hice al aire, no lo probe, de todas formas deberias probar "en masa" :xD


Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Ahh..entonces lo que te doy no te resuelve el problema:
Solo una pregunta, si yo pongo esto

Código:
Hola [b]Mundo[/b] /omg#

Con la expresion regular me deberia salir esto? (o capturar esto):

Código:
Hola Mundo /omg


Título: Re: Problema con expresión regular
Publicado por: ~ Yoya ~ en 12 Febrero 2010, 00:16 am
Ya se lo que quieres hacer, es como un BBCODE, bueno aqui lo que pediste.
Código
  1. <?php
  2.  
  3. function bbcode($text){
  4.  
  5. $text = str_replace('[b]','<strong>',$text);
  6. $text = str_replace('[/b]','</strong>',$text);
  7. $text = str_replace('[img]','<img src="',$text);
  8. $text = str_replace('[/img]','">',$text);
  9. return $text;
  10. }
  11.  
  12. echo bbcode('[b]Hola como estan[/b]');
  13. echo bbcode('[img]http://www.grupogenova.net/Moncan/V20/imgs/upload/gato.jpg[/img]');
  14. ?>

Salida:
(http://img535.imageshack.us/img535/7960/gato.png)

En este caso, el problema no necesita de expresiones regulares para resolverlo, porque no buscas parametros, si no una palabra en expecifica y remplazarla por un Tag html valido.


Título: Re: Problema con expresión regular
Publicado por: egyware en 12 Febrero 2010, 00:24 am
Yuhu!!!
Lo logre usando esta expresion y le agregue unas cosa mas,gracias a ti

Código
  1. $expresion = '/\/([^\s\[\]&;...]*)?#/'
entonces recapitulando
^ sirve para no considerar y se usa al principio
... para que sirve?

Pregunto para saber no mas, ya solucione mi problema

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Para la otra respuesta que salio, no se me ocurrio pero usar expresiones regulares me facilita la posibilidad de agregar más BBCode y otras cosas como esta

Gracias a todos por su respuestas rapidas, lo agradezco


Título: Re: Problema con expresión regular
Publicado por: raul338 en 12 Febrero 2010, 00:31 am
Ahhh! Ahora ya entendi yo tambien (despues de yoyahack y releer el post anterior ...al mio :¬¬ ...:P)

Claro, no necesitas expresiones regulares (aunque se puede hacer, obteniendo los grupos). Solo que cada uno tiene su pro y su contra:

Si lo haces mediante str_replace te combiene contar los tags y ver si cierran, porque si te queda un tag abierto te arruina el resto de la pagina (me ha pasado, tambien quise implementar mi propio bbcode). en cambio si lo haces en expresiones regulares (algo asi, porque no se mucho de las funciones que ofrece PHP para expresiones regualres:

Código
  1. $var = "[b]Hola mundo![/b] /foto.jpg#";
  2. list($antes, $medio, $despues) = split("(.*)\[b\](.*)\[\/b\](.*)", $var);
  3. $newVar = "$antes<b>$medio</b>$despues";
  4.  

O algo asi, no lo he probado (lo probare), deberia funcionar

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

egyware, el "..." no existe asi, es "." que significa cualquier caracter, "..." significa 3 veces cualquier caracter seguidos :P

Edit, en el editor de expreiones regulares, indica que no tiene que haber un "." entre lo capturado jeje, no se toma como cualquier caracter, sino como punto. o sea que si hay un "/hola.mundo#" no te lo va a tomar como valido, asi tambien con el "&;"


Título: Re: Problema con expresión regular
Publicado por: ~ Yoya ~ en 12 Febrero 2010, 00:32 am
Bueno egyware, si piensas extender tu lista de BBCODE, puedes mejor crear un POO así tu code queda mas bonito, organizado y optimizado.