Foros del Web » Programación para mayores de 30 ;) » RegExp »

ayuda con regexp

Estas en el tema de ayuda con regexp en el foro de RegExp en Foros del Web. Buenas, necesito ayuda para realizar lo siguiente: tengo en una variable texto en html, y en éste está entre comentarios lo que se debe borrar: ...
  #1 (permalink)  
Antiguo 10/03/2011, 18:46
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
ayuda con regexp

Buenas,

necesito ayuda para realizar lo siguiente:

tengo en una variable texto en html, y en éste está entre comentarios lo que se debe borrar: "<!-- begin remove -->" y "<!-- end remove -->"

Lo que deseo es usar regular expressions y preg_replace para eliminar cualquier cosa que esté entre esos comentarios (sea palabras, espacios y saltos de línea) incluyendo eliminar estos comentarios.

Espero que alguien me pueda ayudar.

Desde ya, muchas gracias.
  #2 (permalink)  
Antiguo 10/03/2011, 19:50
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 5 meses
Puntos: 127
Respuesta: ayuda con regexp

esta es la función que te salvara la vida.

Código PHP:
function descomentar($archivo){if(! defined('T_ML_COMMENT')){define('T_ML_COMMENT',T_COMMENT );}else{define('T_DOC_COMMENT',T_ML_COMMENT);}$source=file_get_contents($archivo);$tokens=token_get_all($source);foreach($tokens as $token){if(is_string($token)){$todo.=$token;}else{list($id,$text)=$token;switch($id){case T_COMMENT:case T_ML_COMMENT:    case T_DOC_COMMENT: break;default:$todo.=$text;break;}}}return$todo;} 
es tan facil como esto:

Código PHP:
$testo="todo el texto con comentarios y todo";  //tu texto
$resultado=descomentar($testo); // resultado texto sin comentarios 
espero que te guste la funcion.
  #3 (permalink)  
Antiguo 10/03/2011, 23:04
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: ayuda con regexp

gracias enlinea!

pero me tira error.... me dice que algo de que function.file-get-contents 'failed to open stream: No such file or directory in' blabla...

y otra cosa, no se si se entendio bien, tiene que sacar sólo esos dos comentarios INCLUYENDO TODO LO QUE HAYA ENTRE ESTOS DOS. creo que se hace facilmente con regexp, con una simple expresion logica, pero no lo domino mucho.

desde ya, muchas gracias :)
  #4 (permalink)  
Antiguo 11/03/2011, 00:06
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 14 años, 11 meses
Puntos: 11
Respuesta: ayuda con regexp

Necesitas algo como ésto:

Código PHP:
Ver original
  1. preg_replace('/<!-- begin remove -->.*<!-- end remove -->/', '', $texto);

El .* representa cualquier carácter que se repita 0 o más veces.

El inconveniente es que hay que escapar varios caracteres, como no tengo buena memoria generalmente uso la función preg_quote, la cual escapa los caracteres especiales por mi :)

Código PHP:
Ver original
  1. echo preg_quote('<!-- begin remove -->texto<!-- end remove -->');
Lo cual imprime:

\<\!-- begin remove --\>texto\<\!-- end remove --\>

Finalmente, tu expresión regular (con la función) es:

Código PHP:
Ver original
  1. preg_replace('/\<\!-- begin remove --\>.*\<\!-- end remove --\>/', '', $texto);

Nada más, nada menos, saludos.
__________________
Estreno blog ~ DesarrolladorWeb.cl :)
  #5 (permalink)  
Antiguo 11/03/2011, 15:54
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: ayuda con regexp

Muchas gracias RodrigoG! Lo voy a intentar. =]
  #6 (permalink)  
Antiguo 11/03/2011, 16:41
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: ayuda con regexp

Cita:
Iniciado por RodrigoG Ver Mensaje
Necesitas algo como ésto:

Código PHP:
Ver original
  1. preg_replace('/<!-- begin remove -->.*<!-- end remove -->/', '', $texto);

El .* representa cualquier carácter que se repita 0 o más veces.

El inconveniente es que hay que escapar varios caracteres, como no tengo buena memoria generalmente uso la función preg_quote, la cual escapa los caracteres especiales por mi :)

Código PHP:
Ver original
  1. echo preg_quote('<!-- begin remove -->texto<!-- end remove -->');
Lo cual imprime:

\<\!-- begin remove --\>texto\<\!-- end remove --\>

Finalmente, tu expresión regular (con la función) es:

Código PHP:
Ver original
  1. preg_replace('/\<\!-- begin remove --\>.*\<\!-- end remove --\>/', '', $texto);

Nada más, nada menos, saludos.
Mh... no me funciona.... aca tengo la prueba:

Código PHP:
<?php

$texto 
"<!-- begin remove --> 
                <div id='container'>
        <!-- end remove -->
        holaa
        <!-- begin remove -->
        <div id='content'>
        <!-- end remove -->
                <!-- begin remove --><h2 class='bottom-border'>tituloo</h2><!-- end remove -->
                textoo
            <!-- begin remove --></div>

            <!-- end remove -->              
        <!-- begin remove --></div>
        <!-- end remove -->"
;

$texto preg_replace('/\<\!-- begin remove --\>.*\<\!-- end remove --\>/'''$texto);

echo 
$texto// hay que mirar el html que sale, no el final screen

?>
Mucha gracias! :)
  #7 (permalink)  
Antiguo 11/03/2011, 16:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ayuda con regexp

sucede que la expresión si funciona, si la fuente de texto fuera una sola linea... pero como no lo es, y tiene mas de una linea debes usar el modificador s, así la expresión quedaría mejor escrita...

otro detalle es que la expresión .* es muy hambrienta, de modo que se come todo desde la primer aparición hasta la última lo cual arruina la intención de la expresión...

de modo que debería ser .+? para un mejor comportamiento de la misma... (:

te invito a leer lo siguiente:
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 11/03/2011, 18:14
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 14 años, 11 meses
Puntos: 11
Respuesta: ayuda con regexp

Gracias
Así aprendemos todos :)
__________________
Estreno blog ~ DesarrolladorWeb.cl :)
  #9 (permalink)  
Antiguo 11/03/2011, 18:26
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: ayuda con regexp

Cita:
Iniciado por pateketrueke Ver Mensaje
sucede que la expresión si funciona, si la fuente de texto fuera una sola linea... pero como no lo es, y tiene mas de una linea debes usar el modificador s, así la expresión quedaría mejor escrita...

otro detalle es que la expresión .* es muy hambrienta, de modo que se come todo desde la primer aparición hasta la última lo cual arruina la intención de la expresión...

de modo que debería ser .+? para un mejor comportamiento de la misma... (:

te invito a leer lo siguiente:
[url]http://www.forosdelweb.com/f18/aporte-expresiones-pcre-646110/[/url]
Gracias pateketrueke! Si he leido ese aporte reiteradas veces, pero lo entiendo por arriba y nunca tuve el tiempo de profundizar en el tema.

hice la prueba con:
Código PHP:
$texto preg_replace('/\<\!-- begin remove --\>.+?\<\!-- end remove --\>/'''$texto); 
y el resultado es el mismo.. y como sería con el modificador s ??

disculpen la molestia y muchas gracias!!
  #10 (permalink)  
Antiguo 12/03/2011, 13:03
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 5 meses
Puntos: 127
Respuesta: ayuda con regexp

tienes razón seme fue un poco mal el codigo

este es el bueno
Código PHP:
function descomentar($archivo){if(! defined('T_ML_COMMENT')){define('T_ML_COMMENT',T_COMMENT );}else{define('T_DOC_COMMENT',T_ML_COMMENT);}$source=$archivo;$tokens=token_get_all($source);foreach($tokens as $token){if(is_string($token)){$todo.=$token;}else{list($id,$text)=$token;switch($id){case T_COMMENT:case T_ML_COMMENT:    case T_DOC_COMMENT: break;default:$todo.=$text;break;}}}return$todo;}  

$testo="<!-- begin remove -->texto<!-- end remove -->";  //tu texto
$resultado=descomentar($testo); // resultado texto sin comentarios  

print $resultado
quita todo tipo de comentario:
ejemplo:
http://creaelicita.cl/descomentar.php

Última edición por enlinea777; 12/03/2011 a las 13:18
  #11 (permalink)  
Antiguo 12/03/2011, 14:35
 
Fecha de Ingreso: diciembre-2009
Ubicación: dirname(__FILE__)
Mensajes: 149
Antigüedad: 14 años, 11 meses
Puntos: 11
Respuesta: ayuda con regexp

Código PHP:
Ver original
  1. $texto = preg_replace('/\<\!-- begin remove --\>.+?\<\!-- end remove --\>/s', '', $texto);

también podría ser

Código PHP:
Ver original
  1. $texto = preg_replace('/\<\!-- begin remove --\>.+\<\!-- end remove --\>/Us', '', $texto);

los modificadores van luego de los delimitadores (que generalmente son esa barras '/').

http://www.php.net/manual/es/referen....modifiers.php

Hola enlinea777, tu función troza el texto y concatena lo que no es comentario, es decir, hace demasiado trabajo para algo que se puede resolver mejor con una expresión regular, además ernewston sólo quiere borrar los comentarios que tengan "begin remove".

Saludos
__________________
Estreno blog ~ DesarrolladorWeb.cl :)
  #12 (permalink)  
Antiguo 13/03/2011, 13:52
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 5 meses
Puntos: 127
Respuesta: ayuda con regexp

Cita:
Iniciado por RodrigoG Ver Mensaje
http://www.php.net/manual/es/referen....modifiers.php

Hola enlinea777, tu función troza el texto y concatena lo que no es comentario, es decir, hace demasiado trabajo para algo que se puede resolver mejor con una expresión regular, además ernewston sólo quiere borrar los comentarios que tengan "begin remove".

Saludos
jajaja
aunque la funcion es mas complicada es basada en lenguaje de servidor no en el cliente.
por que digo esto?
bueno porque ayuda mucho para eliminar comentarios que ocupan espacio al procesar el renderizado por el navergador y descarga juento a la pagina original.
por si no lo sabias trata de ver una pagina comentada en safari.
en ese navegador los comentarios no se ven pero se puede observar que no renderiza de igual forma.

es mejor descomentar todo por eso de la compatibilidad con navegadores.
  #13 (permalink)  
Antiguo 13/03/2011, 18:26
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 5 meses
Puntos: 127
Respuesta: ayuda con regexp

Cita:
Iniciado por ernewston Ver Mensaje
Buenas,

necesito ayuda para realizar lo siguiente:

tengo en una variable texto en html, y en éste está entre comentarios lo que se debe borrar: "<!-- begin remove -->" y "<!-- end remove -->"

Lo que deseo es usar regular expressions y preg_replace para eliminar cualquier cosa que esté entre esos comentarios (sea palabras, espacios y saltos de línea) incluyendo eliminar estos comentarios.

Espero que alguien me pueda ayudar.

Desde ya, muchas gracias.
usa esta funcion esta 100% funcional mira aqui:
http://creaelicita.cl/descomentar.php

Código PHP:
function borrar_comentarios($data){
$data=str_replace("\r","",$data);
$data=str_replace("\t","",$data);
$data=explode("\n",$data);
        
$totalc=count($data);
            for(
$i=0$i<$totalc$i++){
                
$linea=trim($data[$i]);
                
$linea=preg_replace('@\<\!\-\-(.*)\-\-\>@Us'''$linea);
                
$lineapreg_replace('@/\*(.*)\*/@Us'''$linea);
                if(
substr($linea,0,2)!='//'){
                    if(
trim($linea)!=""){
                        if(
strpos($linea_unida,"//")){
                        
$linea_unida=borrar_espacios($linea);
                        
$tesT=strpos($linea_unida,"//");
                        
$tesT=substr($linea_unida,$tesT-1,1);
                        if(
$tesT==";" || $tesT=="}" || $tesT=="{"){
                        
$esT=strpos($linea,"//");    
                        
$linea=str_replace(substr($linea,$esT-1),"",$linea); 
                        }}
                        
$dataF.=$linea."\n";
                    }
                }
            }
$data=$dataF
return 
trim($data);

funciona bien con cualquier tipi de texto string o parrafo.

P.D. (RodrigoG)
  #14 (permalink)  
Antiguo 13/03/2011, 20:36
 
Fecha de Ingreso: julio-2009
Mensajes: 58
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: ayuda con regexp

EN LINEA77:

muchas gracias!! tu función funciona a la perfeccion para descomentar..... pero me parece que no entendió lo que deseo hacer.

No deseo eliminar SOLO los comentarios (ademas que NO quiero eliminar todos los comentarios)... Si te has dado cuenta los comentarios son '<!-- begin remove -->', donde comienza lo que quiero eliminar, y '<!-- end remove -->' donde termina lo que quiero eliminar.

LO QUE QUIERO ES ELIMINAR SOLAMENTE ESOS DOS TIPOS DE COMENTARIOS INCLUYENDO LO QUE ESTÉ ENTRE ESTOS.

o sea en mi ejemplo, las partes como:

Código PHP:
<!-- begin remove --> 
                <
div id='container'>
        <!-- 
end remove --> 
Código PHP:
<!-- begin remove -->
        <
div id='content'>
        <!-- 
end remove --> 
Código PHP:
<!-- begin remove --><h2 class='bottom-border'>tituloo</h2><!-- end remove --> 
SE DEBEN ELIMINAR INCLUYENDO LO QUE ESTA ENTRE LOS COMENTARIOS.

Igualmente muchas gracias por la ayuda :)


RodrigoG:

la función:
Código PHP:
$texto preg_replace('/\<\!-- begin remove --\>.+\<\!-- end remove --\>/Us'''$texto); 
funcionó a la perfección :) :) MUCHAS GRACIAS!! me salvaste jeje

Bueno perdonen que les haya quitado su tiempo!!

Etiquetas: php
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 12:40.