• Publicidad

Identificar tags de cierre en .html

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Identificar tags de cierre en .html

Notapor polako » 2008-04-19 14:27 @644

Hola, saludos a todos, el tema es que cuando identifique un tag HTML de cierre inmediatamente ponga nueva línea para separarlos.

Ejemplo: si la entrada es
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <h1><p>...askdfjal</p></h1> 
  2. --indentado --> <br> 

La salida debe ser
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <h1><p>laskfajslkfj</p> 
  2. </h1> 
  3. ---- indentado--> <br> 


El código me separa bien, pero no respeta las indentaciones, o sea es:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <h1><p>laskfajslkfj</p> 
  2. </h1> 
  3. <br> #br no está indentado y debería 


Por ahora el tema optimización no es primordial, sino que pueda entender, luego mejoramos :wink:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$er_tags_cierre = '(.*?)(<\s*/)(.+?)(>)(\s*)';

if(open(INFILE,"html.txt"))
{
    $file_aux = "";
    while ($linea = <INFILE>)
    {
         $file_aux = $file_aux.$linea;   # Leemos todas las líneas y las metemos en una variable
    }
    close (INFILE);

    while ($file_aux =~ /$er_tags_cierre/gsi)
    {
        @linea = split /\n/,$1 ;

        foreach $palabra(@linea)
        {
          print $palabra;
        }
        print $2.$3.$4."\n";
     }
}
else
    {print "No hay archivo de entrada\n";}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias! salú
polako
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-04-19 14:15 @635

Publicidad

Notapor explorer » 2008-04-19 16:05 @712

Bienvenido a los foros de Perl en Español, polako.

Quizás el problema esté en el par de paréntesis que captura espacios en blanco, al final, que luego los eliminas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor polako » 2008-04-19 16:42 @737

Hola, gracias por tu bienvenida... bueno, es que soy nuevo total, de ahí mis múltiples errores:

¿Te referís al (\s*) de la exp. regular?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$er_tags_cierre = '(.*?)(<\s*/)(.+?)(>)(\s*)'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He probado con el (\s*) y sin él, y no cambia nada.
Si hago un split usando \n, se supone que los blancos,tab del inicio de palabra quedan; ¿o entendí mal?.

Por eso hago un print $palabra, asumiendo que $palabra puede tener espacios en blanco y tab.

No me doy cuenta, gracias.
Saludos
polako
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-04-19 14:15 @635

Notapor explorer » 2008-04-19 17:40 @777

Sí, haciendo el split por "\n" trabajas por líneas y respeta los espacios, pero resulta que estás haciendo el split de la parte que está delante de la marca de fin.

Es decir, en el ejemplo que estás poniendo, $1 vale '<h1><p>...askdfjal'.

Repasa lo que quieres hacer:

"el tema es que cuando identifique un tag HTML de cierre inmediatamente ponga nueva línea para separarlos"

Bueno, pues justamente eso es lo que puedes hacer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;

if( open(INFILE,"kk.html") ) {

    $file_aux = "";
    while ($linea = <INFILE>) {
        $file_aux .= $linea;   # Leemos todas las líneas y las metemos en una variable
    }
    close (INFILE);

    $file_aux =~ s/(<\/.+?>)/$1\n/simog;

    print $file_aux;
}
else {
    print "No hay archivo de entrada\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es decir, no hacemos una búsqueda, sino una búsqueda y una sustitución. Buscamos las marcas finales y lo sustituimos por ella misma, más un retorno de carro.

Puedes aplicar esto mismo a tu bucle: buscas las marcas finales y le agregas un retorno de carro.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor polako » 2008-04-19 23:17 @012

mmmno, eso no hace lo que busco, ya que me deja cortada la línea siguiente:

Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj................
.............</TITLE>


Ejecuto el código y el </TITLE> queda debajo, y debe quedar en la misma línea, así:

Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj.............................</TITLE>


Ejemplo más extenso. Texto de entrada:
Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj................
.............</TITLE>
<h1><p> este parrafo </p></h1>


Debe salir:
Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj.............................</TITLE>
<h1><p> este parrafo </p>
</h1>


¡Saludos!
polako
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-04-19 14:15 @635

Notapor Jenda » 2008-04-20 07:54 @371

Yo creo que podría ser mejor usar HTML::Tidy, que probar a hacerlo tú mismo. HTML no es tan simple.
http://search.cpan.org/~petdance/HTML-T ... ML/Tidy.pm
http://tidy.sourceforge.net/docs/quickref.html
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor polako » 2008-04-20 13:36 @608

Hola, gracias por el dato, pero la idea es que exprima bien la potencia de las exp. regulares. Creo yo que puede hacerse aunque aun no le encuentro la vuelta.
Saludos
polako
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-04-19 14:15 @635

Notapor Jenda » 2008-04-20 15:55 @705

El problema con regexps y HTML es que las cosas no son tan fáciles como parecen. Por ejemplo mira a ese HTML:

Código: Seleccionar todo
<input type="text" name="titulo" value="Algo <b>muy</b> importante">
<!-- este es un comentario, quieres cambiar
<p>las cosas aqui?</p>
o no?
-->
<input type="text" name="condicion1" value="a<b ">
<input type="text" name="condicion2" value="a>b">


Y, si sigues añadiendo las nuevas líneas detrás de cada cierre, vas a causar que el resultado se ve diferente. Por ejemplo si hay algo así: <b>verdad</b>ero
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor polako » 2008-04-20 16:02 @710

Hola, la restricción es hacer un parser de esas características: aparece un tag de cierre => se inserta nueva línea. No cambia la forma en que el html es interpretado.
De hecho con mi código logré hacerlo, lo que no logro es que respete las indentaciones (como puse un post mas arriba), y eso es lo que ahora busco.

Entrada (ver la indentación de la línea que comienza con <h1>):
Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj................
.............</TITLE>
        <h1><p> este parrafo </p></h1>


Mi salida es (se 'come' la indentación mencionada):
Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj.............................</TITLE>
<h1><p> este parrafo </p>
</h1>


Debería ser (sigue la indentación en <h1>):
Código: Seleccionar todo
<title> Titulo de mi web lasdkfjalksdj.............................</TITLE>
        <h1><p> este parrafo </p>
</h1>


Creo que Perl tiene potencia suficiente en su manejo de las exp. regulares como para lograrlo, es cuestión de práctica y muchas macanas de por medio. Por ello de momento voy a prescindir de otros utilitarios.
Como siempre, cualquier pista bienvenida, sigo en eso :?
Saludos
polako
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-04-19 14:15 @635

Notapor monoswim » 2008-04-20 22:03 @960

Yo probaría haciendo:

Juntar todo el contenido en una variable de texto...
eliminar los espacios en blanco y saltos de línea que se encuentren entre las etiquetas (><).

Una vez que tienes todas las etiquetas de corrido las puedes separar como gustes ;-)

Espero que te sirva.

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 28 invitados