Foros del Web » Programando para Internet » PHP »

expresiones regulares

Estas en el tema de expresiones regulares en el foro de PHP en Foros del Web. tengo un problema lo que quiero es cambiar el color de un texto y el codigo que utilo ese este $msg = preg_replace("/\[color:([A-z0-9]*)\]([A-z0-9].*)\[\/color\]/",'<font color="\\1">\\2</font>',$msg); cuando ...
  #1 (permalink)  
Antiguo 26/03/2004, 05:10
 
Fecha de Ingreso: marzo-2004
Mensajes: 6
Antigüedad: 20 años
Puntos: 0
Pregunta expresiones regulares

tengo un problema lo que quiero es cambiar el color de un texto y el codigo que utilo ese este

$msg = preg_replace("/\[color:([A-z0-9]*)\]([A-z0-9].*)\[\/color\]/",'<font color="\\1">\\2</font>',$msg);

cuando pongo

[color:red]aqui el texto[/color]

va bien todo en rojo pero si pongo

[color:red]aqui el texto[/color] [color:white]mas texto[/color]

me pone todo en rojo en vez de una parte en rojo y la otra en blanco ysi ahy un enter osea:

[color:red]aqui el texto[/color]

[color:white]mas texto[/color]

si sale bien, que puede hacer para arreglarlo???????????
  #2 (permalink)  
Antiguo 26/03/2004, 08:09
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 1 mes
Puntos: 0
Hola:
Seguramente hay una expresion regular que haga lo que queres hacer, pero no se cual es. Pero lo que podrias hacer es multiples expresiones (en realidad 2). Fijate en el ejemplo 2 de la explicacion de preg_replace en php.net como usan vectores para hacerlo.
Entonces podrias cambiar
[color:micolor] por <font color="micolor">
y
[/color] por </font>

Ej:
Código PHP:
$msg '[color:red]aqui el texto[/color] [color:white]mas texto[/color]';
$pat[0] = "/\[color:([A-z0-9]*)\]/";
$pat[1] = "/\[\/color\]/";
$rep[0] = '<font color="\\1">';
$rep[1] = '</font>';
$msg preg_replace($pat,$rep,$msg); 
__________________
Saludos!
  #3 (permalink)  
Antiguo 26/03/2004, 08:25
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 4 meses
Puntos: 69
El problema está en que al poner dos "tags" de color juntos ( o tres, o lo que sea ), tu expresión va a tomar como el [ color ] inicial siempre el primero de todos y el [ /color ] final siempre el último de todos. Sin importar la cantidad que haya ni como estén anidados. Por eso, podrías cambiar tu RegEx asi :

Código PHP:
<?php
$msg 
reg_replace(
    
"/\\[color:([A-z0-9]*)\\]([^\\[]*[A-z0-9]*)\\[\\/color\\]/",
    
'<font color="\\\\1">\\\\2</font>',
    
$msg);
?>
De esa manera, valida los tramos de código que NO contentan un "[" dentro.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 26/03/2004, 08:29
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 4 meses
Puntos: 69
Esto, o bien podrías explorar otras opciones un poco más flexibles. Por ejemplo, permitir el uso de código HTML y no Tags predefinidos, utilizando luego strip_tags() para dejar SOLO los tags que te interese (font, b, i, etc).
O también podés utilizar un parser XML SAX, y ante distintos tags tuyos predeterminados, programarle métodos para que reemplaze por ciertas cosas.
Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #5 (permalink)  
Antiguo 26/03/2004, 15:00
 
Fecha de Ingreso: febrero-2004
Ubicación: Bs. As. - Argentina
Mensajes: 53
Antigüedad: 20 años, 1 mes
Puntos: 0
El problema es que no podes tener texto con [. Yo creo que se puede hacer la ER en una sola linea y sin este problema.
__________________
Saludos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:33.