Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problemilla expresión regular preg_replace

Estas en el tema de Problemilla expresión regular preg_replace en el foro de PHP en Foros del Web. Buenos dias ! A ver si alguien me puede echar un cable... El caso es que quiero capturar los estilos de los elementos html que ...
  #1 (permalink)  
Antiguo 23/10/2018, 03:05
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 14 años, 1 mes
Puntos: 8
Pregunta Problemilla expresión regular preg_replace

Buenos dias !

A ver si alguien me puede echar un cable...

El caso es que quiero capturar los estilos de los elementos html que tengo en una cadena y hacer un "clon" de ellos por que en algún momento los puedo necesitar tal como estavan en un principio.

por ejemplo tengo

Código HTML:
Ver original
  1. <span class="col-md-12" ></span> <span class="miau" ></span>

y me gustaría que quedara así :
Código HTML:
Ver original
  1. <span class="col-md-12" r="col-md-12" ></span> <span class="miau" r="miau" ></span>

Estoy usando esta expresión dentro de preg_replace pero algo se me escapa... viendo el código de la cadena que proporciono ( que me lo genera un REST), tendría que buscar class="(algo)"[espacio], pero creo que se me esta fallando en el espacio de después de las últimas comillas dobles, porque si solo pongo un span en la cadena me genera el resultado correcto.


Código PHP:
Ver original
  1. $cadena='<span class="col-md-12" ></span> <span class="col-md-22" ></span>';
  2.  
  3. echo preg_replace('~ class="(.+)" ~',' class="$1" rclass="$1" ', $cadena);
  4.  
  5. resultado : <span class="col-md-12" ></span> <span class="col-md-22" rclass="col-md-12" ></span> <span class="col-md-22" ></span>
  6.  
  7.  
  8. $cadena='<span class="col-md-12" ></span>';
  9.  
  10. echo preg_replace('~ class="(.+)" ~',' class="$1" rclass="$1" ', $cadena);
  11.  
  12. resultado :
  13.  
  14. <span class="col-md-12" rclass="col-md-12" ></span>

A ver si alguien me puede iluminar

Un saludo y gracias
  #2 (permalink)  
Antiguo 23/10/2018, 11:26
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 16 años, 2 meses
Puntos: 120
Respuesta: Problemilla expresión regular preg_replace

las expresiones regulares pueden ser muy potentes pero a lavez muy complejas, yo con los 10 años programando, recien me lo estoy digiriendo, bueno en fin

mira la causa del problema es por tu expresion (.+) le estas indicando, que soporte cualquier caracter, y no estas usando Modificadores, una expresion regular en PHP los modificadores, van en

Código PHP:
Ver original
  1. $variable = preg_match("~..~[MODIFICADORES]")
esos modificadores, lo que hacen es que la expresion regular se comporte de manera diferente,

ahora volviendo al caso (.+) le estas indicando que sea cualquier caracter INCLUYENDO las comillas dobles ", lo cual hace que sea valido, la expresion pero da un resultado que tu no buscas, a esto se le llama si no me equivoco, CODICIA de la expresion, siempre querra abarcar mas , para que realize lo invertido, puedes usar el inversor de CODICIA , que es +? o *?

en resumen tu codigo deberia funcionar asi

Código PHP:
Ver original
  1. $cadena='<span class="col-md-12" ></span> <span class="col-md-22" ></span>';
  2.  
  3. echo preg_replace('~ class="(.+)" ~',' class="$1" rclass="$1" ', $cadena);
  4.  
  5. resultado : <span class="col-md-12" ></span> <span class="col-md-22" rclass="col-md-12" ></span> <span class="col-md-22" ></span>
  6.  
  7.  
  8. $cadena='<span class="col-md-12" ></span>';
  9.  
  10. echo preg_replace('~ class="(.+?)" ~',' class="$1" rclass="$1" ', $cadena);
  11.  
  12. resultado :
  13.  
  14. <span class="col-md-12" rclass="col-md-12" ></span>

ahora otra forma y la que mas ocupo yo, es en lugar de aceptar todo caracter, yo hago una lista negra de que no debe ir nunca jamas en la expresion ,

([^los caracteres a evitar]+) en tu caso el caracter seria las comillas dobles,

Código PHP:
Ver original
  1. $cadena='<span class="col-md-12" ></span> <span class="col-md-22" ></span>';
  2.  
  3. echo preg_replace('~ class="(.+)" ~',' class="$1" rclass="$1" ', $cadena);
  4.  
  5. resultado : <span class="col-md-12" ></span> <span class="col-md-22" rclass="col-md-12" ></span> <span class="col-md-22" ></span>
  6.  
  7.  
  8. $cadena='<span class="col-md-12" ></span>';
  9.  
  10. echo preg_replace('# class="([^"]+)" #',' class="$1" rclass="$1" ', $cadena);
  11.  
  12. resultado :
  13.  
  14. <span class="col-md-12" rclass="col-md-12" ></span>
tambien para futuras referencias, existe el preg_replace_callback, es muy potente y util, para ciertos casos
  #3 (permalink)  
Antiguo 24/10/2018, 02:28
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 14 años, 1 mes
Puntos: 8
De acuerdo Respuesta: Problemilla expresión regular preg_replace

Funciona de maravilla!

Muchas gracias tuadmin, en verdad era muy fácil llegar al planteamiento que propones... pero claro cuando te lo explican pues siempre se ve mas sencillo

Un saludo

Etiquetas: expresion, preg_replace, regular
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 15:04.