Problema con expresión regular

Iniciado por egyware, 11 Febrero 2010, 23:30 PM

0 Miembros y 2 Visitantes están viendo este tema.

egyware

Hola a todos
estoy haciendo una expresion regular que no me funciona bien del todo
esta es

Código (php) [Seleccionar]
$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

~ Yoya ~

Ok, no entendi muy bien, escribe lo que quieres sacar en un :
Aqui
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

egyware

Este es el texto por ejemplo

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

Pero con el actual codigo que tengo me sale algo asi
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

raul338

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:
$expresion = '/\/(\w*)?#/';

o sino
$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

Hola [b]Mundo[/b] /omg#

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

Hola Mundo /omg

~ Yoya ~

#4
Ya se lo que quieres hacer, es como un BBCODE, bueno aqui lo que pediste.
Código (php) [Seleccionar]
<?php

function bbcode($text){

$text str_replace('[b]','<strong>',$text);
$text str_replace('[/b]','</strong>',$text);
$text str_replace('[img]','<img src="',$text);
$text str_replace('[/img]','">',$text);
return 
$text;
}

echo 
bbcode('[b]Hola como estan[/b]');
echo 
bbcode('[img]http://www.grupogenova.net/Moncan/V20/imgs/upload/gato.jpg[/img]');
?>


Salida:


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.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

egyware

Yuhu!!!
Lo logre usando esta expresion y le agregue unas cosa mas,gracias a ti

Código (php) [Seleccionar]
$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

raul338

#6
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 (PHP) [Seleccionar]

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


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 "&;"

~ Yoya ~

Bueno egyware, si piensas extender tu lista de BBCODE, puedes mejor crear un POO así tu code queda mas bonito, organizado y optimizado.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.