Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/10/2018, 11:26
tuadmin
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
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