Foros del Web » Programando para Internet » PHP »

Encontrar etiquetas html, class y id's (con expresiones regulares)

Estas en el tema de Encontrar etiquetas html, class y id's (con expresiones regulares) en el foro de PHP en Foros del Web. Buenas, Estoy intentando armar unas expresiones regulares capaces de printar todas las etiquetas html diferentes, clases y id's (de estilo) que encuentre. Ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 12/01/2010, 12:40
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Encontrar etiquetas html, class y id's (con expresiones regulares)

Buenas,

Estoy intentando armar unas expresiones regulares capaces de printar todas las etiquetas html diferentes, clases y id's (de estilo) que encuentre.

Ejemplo:

Código PHP:
Ver original
  1. <?
  2. /* SACAR TODAS LAS ETIQUETAS, ID Y CLASES DEL ESTILO CSS */
  3. $html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  5. <head>
  6.     <title>Área restringida | Panel de Administración</title>
  7.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8.     <meta name="robots" content="noindex,nofollow"/>
  9.     <link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
  10.     <!-- Favicon -->
  11.     <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  12. </head>
  13. <body class="login">
  14.     <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  15.     <!-- Formulario Entrada -->
  16.     <div id="login">
  17.         <h1 id="titulo" title="Panel de Administración"></h1>
  18.  
  19.         <form id="loginform" action="includes/login.php" method="post">
  20.             <p>
  21.                 <label>Nombre de usuario<br />
  22.                 <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  23.             </p>
  24.             <p>
  25.                 <label>Contraseña<br />
  26.                 <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  27.             </p>
  28.             <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  29.             <p class="submit">
  30.                 <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  31.             </p>
  32.         </form>
  33.         <p id="nav">
  34.             <a class="footer" href="#">Área privada.</a>
  35.         </p>
  36.     </div>
  37.     </body>
  38. </html>
  39. ';
  40.  
  41.  
  42. preg_match_all('/(<a.*?)class="(.*?)"/is',$html,$matches);
  43. print_r($matches);
  44. echo "<br/>";
  45. preg_match_all('/<h1.*?/is',$html,$matches);
  46. print_r($matches);
  47. ?>

No se bien bien como decirle que printe (solo una vez) todas las etiquetas distintas del codigo html que vaya encontrando
Ej.
body, p, form, h1,label, a

Y todas las class e id's

class="login"
id="login"
id="loginform"
id="borde-top"
id="nav"
class="submit"
class="footer"


Con la primera expresión regular obtengo esta salida
Array ( [0] => Array ( [0] => Array ( [0] => Array ( [0] => enlace_top [1] => footer ) )

La cual ya no entiendo porque hay tantos arrays dentro de otros! esto pasa siempre?

Debería tener una array con todas las etiquetas que quiero que busque o las escribo directamente en la expresión regular?

PD: He mirado varias paginas de expresiones regulares sin éxito.
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
http://www.ignside.net/man/php/regex.php

Gracias de antemano
  #2 (permalink)  
Antiguo 12/01/2010, 14:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Podrias hacerlo algo así.
Código PHP:
Ver original
  1. <?php
  2. /* SACAR TODAS LAS ETIQUETAS, ID Y CLASES DEL ESTILO CSS */
  3. $html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  5. <head>
  6.    <title>Área restringida | Panel de Administración</title>
  7.    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8.    <meta name="robots" content="noindex,nofollow"/>
  9.    <link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
  10.    <!-- Favicon -->
  11.    <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  12. </head>
  13. <body class="login">
  14.    <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  15.    <!-- Formulario Entrada -->
  16.    <div id="login">
  17.        <h1 id="titulo" title="Panel de Administración"></h1>
  18.  
  19.        <form id="loginform" action="includes/login.php" method="post">
  20.            <p>
  21.                <label>Nombre de usuario<br />
  22.                <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  23.            </p>
  24.            <p>
  25.                <label>Contraseña<br />
  26.                <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  27.            </p>
  28.            <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  29.            <p class="submit">
  30.                <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  31.            </p>
  32.        </form>
  33.        <p id="nav">
  34.            <a class="footer" href="#">Área privada.</a>
  35.        </p>
  36.    </div>
  37.    </body>
  38. </html>
  39. ';
  40. preg_match_all('/<(a|p|form|h1|label|body)[^>](?:(class|id)="(.*?)")[^>]*>/is',$html,$matches);
  41. print_r($matches);
Para verlo mejor te sugiero que mires el código fuente. Pequeña explicación de algunas partes del código de expresion regular
() = cada parentesis muestra un array adicional
(?: = no se muestre un array adicional de los parentesis
[^>]* = Todo aquello que este antes y que no sea el simbolo de >
| = significa escoger entre esas opciones. Es como decir escoge entre esto o este
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 12/01/2010, 14:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

porque no usar htmlSQL en este caso??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 12/01/2010, 14:50
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por abimaelrc Ver Mensaje
Podrias hacerlo algo así.
Código PHP:
Ver original
  1. <?php
  2. /* SACAR TODAS LAS ETIQUETAS, ID Y CLASES DEL ESTILO CSS */
  3. $html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  5. <head>
  6.    <title>Área restringida | Panel de Administración</title>
  7.    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8.    <meta name="robots" content="noindex,nofollow"/>
  9.    <link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
  10.    <!-- Favicon -->
  11.    <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  12. </head>
  13. <body class="login">
  14.    <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  15.    <!-- Formulario Entrada -->
  16.    <div id="login">
  17.        <h1 id="titulo" title="Panel de Administración"></h1>
  18.  
  19.        <form id="loginform" action="includes/login.php" method="post">
  20.            <p>
  21.                <label>Nombre de usuario<br />
  22.                <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  23.            </p>
  24.            <p>
  25.                <label>Contraseña<br />
  26.                <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  27.            </p>
  28.            <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  29.            <p class="submit">
  30.                <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  31.            </p>
  32.        </form>
  33.        <p id="nav">
  34.            <a class="footer" href="#">Área privada.</a>
  35.        </p>
  36.    </div>
  37.    </body>
  38. </html>
  39. ';
  40. preg_match_all('/<(a|p|form|h1|label|body)[^>](?:(class|id)="(.*?)")[^>]*>/is',$html,$matches);
  41. print_r($matches);
Para verlo mejor te sugiero que mires el código fuente. Pequeña explicación de algunas partes del código de expresion regular
() = cada parentesis muestra un array adicional
(?: = no se muestre un array adicional de los parentesis
[^>]* = Todo aquello que este antes y que no sea el simbolo de >
| = significa escoger entre esas opciones. Es como decir escoge entre esto o este
Muchas Gracias!

No entiendo porque aparece estructurado así el array $matches

Código:
Array
(
    [0] => Array
        (
            [0] => 
            [1] => 

[2] => [3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] => ) [1] => Array ( [0] => body [1] => p [2] => a [3] => h1 [4] => form [5] => p [6] => p [7] => p [8] => a ) [2] => Array ( [0] => class [1] => id [2] => class [3] => id [4] => id [5] => class [6] => class [7] => id [8] => class ) [3] => Array ( [0] => login [1] => borde-top [2] => enlace_top [3] => titulo [4] => loginform [5] => forgetmenot [6] => submit [7] => nav [8] => footer ) )
Sin embargo, la parte que interesa están en estas 3 posiciones, entiendo que en la primera posición se guarda todo el lo que coincide (PRIMER PARENTESIS (a|p|form|h1|label|body))

El segundo guarda todos los id y class que están ligados directamente con el tercero.

Código:
print_r($matches[1]);
Array
(
    [0] => body
    [1] => p
    [2] => a
    [3] => h1
    [4] => form
    [5] => p
    [6] => p
    [7] => p
    [8] => a
)

print_r($matches[2]);
Array
(
    [0] => class
    [1] => id
    [2] => class
    [3] => id
    [4] => id
    [5] => class
    [6] => class
    [7] => id
    [8] => class
)
print_r($matches[3]);
Array
(
    [0] => login
    [1] => borde-top
    [2] => enlace_top
    [3] => titulo
    [4] => loginform
    [5] => forgetmenot
    [6] => submit
    [7] => nav
    [8] => footer
)
Me gustaría hacer un bucle:

Código PHP:
foreach($matches[3] as $item)
{
  print 
"$item<br/>" ;

login
borde-top
enlace_top
titulo
loginform
forgetmenot
submit
nav
footer

Que me imprima un . delante de los que son class y un # de los que son id ya que en css sino estoy equivocado siempre van acompañados del . del # según su categoría.

Gracias de antemano!
  #5 (permalink)  
Antiguo 12/01/2010, 14:55
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Como te indique mira el codigo fuente en vez de verlo directamente en la pagina web.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 12/01/2010, 15:30
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por abimaelrc Ver Mensaje
Como te indique mira el codigo fuente en vez de verlo directamente en la pagina web.
Waaaaaaaaaaaaaaaaaala!!!! esto es magia xDDD

Pensaba que te referias al codigo fuente del script que posteaste. Tremendo...

Pero no aparecen los elementos que no tienen ni id ni class ej.

Aunque ponga (input, y label) no los detecta y debería pues estan dentro de la expresion regular

Código PHP:
Ver original
  1. preg_match_all('/<(a|p|form|h1|label|input|div|body)[^>](?:(class|id)="(.*?)")[^>]*>/is',$html,$matches);
  #7 (permalink)  
Antiguo 13/01/2010, 00:51
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Tengo el problema de que no detecta las expresiones input o label (post anterior)

Además, estoy teniendo problemas para sacar todos los tags html diferentes que encuentre.

Código PHP:
Ver original
  1. $html='<a class="footer" href="#">Área privada.</a><span class="hola" asfda sfasdf ><a class="aas" href="#"><span>Área privada.</span></a></span>
  2. ';
  3.  
  4. preg_match_all('/\<(.*?)\>/is',$html,$matches);
  5. echo "<pre>";
  6. print_r($matches);
  7. echo "</pre>";

Resultado que consigo...
Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <a class="footer" href="#">
            [1] => </a>
            [2] => <span class="hola" asfda sfasdf >
            [3] => <a class="aas" href="#">
            [4] => <span>
            [5] => </span>

            [6] => </a>
            [7] => </span>
        )

    [1] => Array
        (
            [0] => a class="footer" href="#"
            [1] => /a
            [2] => span class="hola" asfda sfasdf 
            [3] => a class="aas" href="#"
            [4] => span
            [5] => /span
            [6] => /a
            [7] => /span
        )

)
</pre>
El resultado en este caso debería ser que solo hay 2 tags html: A y SPAN y no como se muestra actualmente. No he conseguido quedarme solo con el nombre del tag html

Gracias de antemano!
  #8 (permalink)  
Antiguo 13/01/2010, 16:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

No consigo sacar la expresion regular para sacar el nombre de todos los tags html que encuentre

Código PHP:
Ver original
  1. $html='<html><body><a class="footer" href="#">Área privada.</a><span class="hola" asfda sfasdf ><a class="aas" href="#"><span>Área privada.</span></a></span></body></html>
  2. ';
  3.  
  4. preg_match_all('/<(.*?)[^\/]\>/is',$html,$matches);
  5. echo "<pre>";
  6. print_r($matches);
  7. echo "</pre>";

Supuestamente estoy buscando todo lo que empieze por <
seguido de cualquier cosa (.*?)
que no tenga una barra /
acabe en >

Esta es la salida del codigo fuente que produce

Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <html>
            [1] => <body>
            [2] => <a class="footer" href="#">
            [3] => </a>
            [4] => <span class="hola" asfda sfasdf >
            [5] => <a class="aas" href="#">

            [6] => <span>
            [7] => </span>
            [8] => </a>
            [9] => </span>
            [10] => </body>
            [11] => </html>

        )

    [1] => Array
        (
            [0] => htm
            [1] => bod
            [2] => a class="footer" href="#
            [3] => /
            [4] => span class="hola" asfda sfasdf
            [5] => a class="aas" href="#
            [6] => spa
            [7] => /spa
            [8] => /
            [9] => /spa
            [10] => /bod
            [11] => /htm
        )

)
</pre>
Debería salir que hay estas cuatro etiquetas:
html
body
a
span

Sabéis que hago mal de la expresión regular?

Muchas gracias de antemano
  #9 (permalink)  
Antiguo 14/01/2010, 15:49
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Nuevo intento sin éxito de seleccionar todos los elementos HTML diferentes


Código PHP:
Ver original
  1. $html='<html><body><a class="footer" href="#">Área privada.</a><span class="hola" asfda sfasdf/><a class="aas" href="#"><span>Área privada.</span></a></span></body></html>';
  2.  
  3. preg_match_all('/<(?:[^class])(.*?)\>/is',$html,$matches);
  4. echo "<pre>";
  5. print_r($matches);
  6. echo "</pre>";

Resultado

Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <html>
            [1] => <body>
            [2] => </a>
            [3] => </span>
            [4] => </a>
            [5] => </span>

            [6] => </body>
            [7] => </html>
        )

    [1] => Array
        (
            [0] => tml
            [1] => ody
            [2] => a
            [3] => span
            [4] => a
            [5] => span
            [6] => body
            [7] => html
        )

)
</pre>
No lo consigo, por un motivo extraño en determinados tags html no me muestra todas sus letras, y me muestra los tags cerrados, yo los que quiero son los tags abiertos, y no con su estilo, simplemente el nombre del tag
body
html
a
span
etc...

¿Alguien puede echarme una mano con estas expresiones regulares?, no salen por mas que lo intento

Gracias de antemano
  #10 (permalink)  
Antiguo 14/01/2010, 15:54
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

en realidad no e leido tu post, no me queda mucho para salir del trabajo
pero intenta esto

/\<(?:[^class])(.*?)\>/is

escapa el primer < con un \

saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #11 (permalink)  
Antiguo 14/01/2010, 15:55
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)



Cita:
/<(\w+)[^>]*\/?>/Uis
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 14/01/2010, 17:47
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por Hidek1 Ver Mensaje
en realidad no e leido tu post, no me queda mucho para salir del trabajo
pero intenta esto

/\<(?:[^class])(.*?)\>/is

escapa el primer < con un \

saludos!
Resultado bastante parecido al mio

Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <html>
            [1] => <body>
            [2] => </a>
            [3] => </span>
            [4] => </a>
            [5] => </span>

            [6] => </body>
            [7] => </html>
        )

    [1] => Array
        (
            [0] => tml
            [1] => ody
            [2] => a
            [3] => span
            [4] => a
            [5] => span
            [6] => body
            [7] => html
        )

)
</pre>
pateketrueke

/<(\w+)[^>]*\/?>/Uis

Resultado también se come letras

Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <html>
            [1] => <body>
            [2] => </a>
            [3] => </span>
            [4] => </a>
            [5] => </span>

            [6] => </body>
            [7] => </html>
        )

    [1] => Array
        (
            [0] => tml
            [1] => ody
            [2] => a
            [3] => span
            [4] => a
            [5] => span
            [6] => body
            [7] => html
        )

)
</pre>
No es fácil por lo que veo
  #13 (permalink)  
Antiguo 14/01/2010, 19:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)



Código PHP:
<?php
      $html
='<html><body><a class="footer" href="#">Área privada.</a><span class="hola" asfda sfasdf/><a class="aas" href="#"><span>Área privada.</span></a></span></body></html>';
      
preg_match_all('/<(\w+)[^>]*\/?>/',$html,$matches);
      echo 
"<pre>";
      echo 
htmlspecialchars(print_r($matches,1));
      echo 
"</pre>";
?>
¿que tal así?? ;)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #14 (permalink)  
Antiguo 15/01/2010, 01:05
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por pateketrueke Ver Mensaje


Código PHP:
<?php
      $html
='<html><body><a class="footer" href="#">Área privada.</a><span class="hola" asfda sfasdf/><a class="aas" href="#"><span>Área privada.</span></a></span></body></html>';
      
preg_match_all('/<(\w+)[^>]*\/?>/',$html,$matches);
      echo 
"<pre>";
      echo 
htmlspecialchars(print_r($matches,1));
      echo 
"</pre>";
?>
¿que tal así?? ;)
Mucha gracias pateketrueke,

He probado tu código y gracias a él pude llegar casi hasta donde quería, solo falta poderle decir que tags quieres excluir, dentro del a RegExp.

Código PHP:
Ver original
  1. function Extraer_Tags_HTML($html){
  2.     preg_match_all('/<(\w+)[^>]*\/?>/',$html,$matches);
  3.     echo "<pre>";
  4.     echo print_r($matches[1],1);
  5.     echo "</pre>";
  6.     $sin_duplicados=array_unique($matches[1]); //elimina los tags HTML repetidos
  7.    
  8.     return $sin_duplicados;
  9. }
  10.  
  11. // Imprime el array de tags HTML
  12. $resultado=Extraer_Tags_HTML($html);
  13. foreach($resultado as $value)
  14.     echo $value . "<br/>";

Salida correcta

Código:
Array
(
    [0] => html
    [1] => head
    [2] => title
    [3] => meta
    [4] => meta
    [5] => link
    [6] => link
    [7] => body
    [8] => p
    [9] => a
    [10] => div
    [11] => h1
    [12] => form
    [13] => p
    [14] => label
    [15] => br
    [16] => input
    [17] => p
    [18] => label
    [19] => br
    [20] => input
    [21] => p
    [22] => label
    [23] => input
    [24] => p
    [25] => input
    [26] => p
    [27] => a
)

html
head
title
meta
link
body
p
a
div
h1
form
label
br
input
Si quiero poder introducir los tags html que quiero que no me saque ej. meta y title no se haría con la negación ^[^meta|title] ?

Saca todo igual que antes, menos todos los tags que empiecen por META o TITLE.

preg_match_all('/<^[^meta|title](\w+)[^>]*\/?>/',$html,$matches);

No entiendo porque es tan difícil!!!!!!!!!
  #15 (permalink)  
Antiguo 15/01/2010, 01:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

lo que sucede es que la negación no funciona de ese modo... ya que al usar corchetes se dice que se niega algún carácter contenido en el conjunto...

vamos, que no se pueden negar frases completas de esa manera...

te sugiero ahondar mas en tu lectura de expresiones regulares, no mas... ;)


o bien, fácilmente puedes iterar tu lista de tags y omitir algunos específicamente usando lógica if-then-else
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 15/01/2010, 15:15
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por pateketrueke Ver Mensaje
lo que sucede es que la negación no funciona de ese modo... ya que al usar corchetes se dice que se niega algún carácter contenido en el conjunto...

vamos, que no se pueden negar frases completas de esa manera...

te sugiero ahondar mas en tu lectura de expresiones regulares, no mas... ;)


o bien, fácilmente puedes iterar tu lista de tags y omitir algunos específicamente usando lógica if-then-else
pateketrueke me gustaría hacerlo con expresiones regulares.
He leido más de una veintena de páginas que hablaban de expresiones regulares y no he visto la forma de conseguir excluir tags como meta o title en mi patrón

Código PHP:
preg_match_all('/<(\w+)[^>]*\/?>/',$html,$matches); 
Lo he probado de mil formas distintas sin lograrlo, algunas de ellas...

Código PHP:
Ver original
  1. preg_match_all('/<[^meta](\w+)[^>]*\/?>/',$html,$matches);
  2. preg_match_all('/<([^meta]\w+)[^>]*\/?>/',$html,$matches);
  3. preg_match_all('/<([^meta])(\w+)[^>]*\/?>/',$html,$matches);
  4. preg_match_all('/<([^meta])?(\w+)[^>]*\/?>/',$html,$matches);
  5. preg_match_all('/<(^[^meta])?(\w+)[^>]*\/?>/',$html,$matches);

¿Me puedes decir donde aparece un ejemplo similar? no he sido capaz de encontrar ninguno que niegue como necesito.

¿O alguien puede decirme como conseguirlo?

Muchas gracias de antemano!

Edito:
Tampoco he sido capaz con esta chuleta, la clave está ahí?!

(?:) No captura subpatron - ((?:foo|fu)bar) captura foobar o fubar sin que foo o fu se capture como subpatron
(?=) Mirar adelante - foo(?=bar) captura foo cuando es seguido de bar
(?!) Mirar adelante (negativa) - foo(?!bar) captura foo cuando NO es seguido de bar
(?<=) Mirar atras - (?<=foo)bar captura bar cuando es precedido de foo
(?<!) Mirar atras (negativa) - (?<!foo)bar captura bar cuando NO es precedido de foo
(?>) Al menos el subpatron - (?>\d+)bar captura aun cuando bar NO esta presente
(?(x)) Condicionales de subpatron - (?(3)foo|fu)bar captura foo si el 3er subpatron se capturo, fu si no
(?#) Comentario - (?# el patron hace x y o z)

Última edición por neodani; 15/01/2010 a las 15:21
  #17 (permalink)  
Antiguo 15/01/2010, 16:00
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

No me lo puedo creer fui capaz :D

Código PHP:
Ver original
  1. /*
  2. Busca todos los tags HTML.
  3. Puedes indicar cuales quieres excluir, dentro de la expresión regular.
  4. En el ejemplo, se excluyen (meta,title,body y head)
  5. */
  6. function Extraer_Tags_HTML($html){
  7.     preg_match_all('/<(?!meta|title|body|head)(\w+)[^>]*\/?>/',$html,$matches);
  8.     $sin_duplicados=array_unique($matches[1]); //elimina los tags HTML repetidos
  9.    
  10.     return $sin_duplicados;
  11. }
  12.  
  13. // Imprime el array de tags HTML
  14. $resultado=Extraer_Tags_HTML($html);
  15. foreach($resultado as $value)
  16.     echo $value . "<br/>";

Ahora solo falta la otra parte del post diferenciar las clases y los id's del estilo

Tengo lo siguiente, gracias a la ayuda abimaelrc

Código PHP:
Ver original
  1. <?
  2. /* SACAR TODAS LAS ETIQUETAS, ID Y CLASES DEL ESTILO CSS */
  3. $html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  5. <head>
  6.     <title>Área restringida | Panel de Administración</title>
  7.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8.     <meta name="robots" content="noindex,nofollow"/>
  9.     <link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
  10.     <!-- Favicon -->
  11.     <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  12. </head>
  13. <body class="login">
  14.     <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  15.     <!-- Formulario Entrada -->
  16.     <div id="login">
  17.         <h1 id="titulo" title="Panel de Administración"></h1>
  18.  
  19.         <form id="loginform" action="includes/login.php" method="post">
  20.             <p>
  21.                 <label>Nombre de usuario<br />
  22.                 <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  23.             </p>
  24.             <p>
  25.                 <label>Contraseña<br />
  26.                 <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  27.             </p>
  28.             <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  29.             <p class="submit">
  30.                 <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  31.             </p>
  32.         </form>
  33.         <p id="nav">
  34.             <a class="footer" href="#">Área privada.</a>
  35.         </p>
  36.     </div>
  37.     </body>
  38. </html>
  39. ';
  40.  
  41.  
  42. preg_match_all('/<(a|p|form|h1|label|input|div|body)[^>](?:(class|id)="(.*?)")[^>]*>/is',$html,$matches);
  43. echo "<pre>";
  44. print_r($matches);
  45.  
  46. foreach($matches[3] as $item)
  47. {
  48.   print "$item<br/>" ;
  49. }
  50. echo "</pre>";
  51. echo "<br/>";
  #18 (permalink)  
Antiguo 15/01/2010, 16:07
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

la practica, practica, practica te ayudará a comprender mejor las expresiones regulares.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #19 (permalink)  
Antiguo 16/01/2010, 16:05
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por abimaelrc Ver Mensaje
la practica, practica, practica te ayudará a comprender mejor las expresiones regulares.
Casi lo tengo, estoy muy contento con mis avances en las expresiones regulares xDDD

Modifiqué el patrón hasta poder conseguir separar los CLASS por un lado y los ID por otro. Puse robustez en el hecho que estos elementos pueden aparecer con comillas dobles o simples.

El problema que no he conseguido solucionar, es la disyunción de CLASS e ID. Falla cuando aparecen los dos en la misma linea, no coge ambos.

EJEMPLO de linea
<input type="text" name="user" id="user_login" class="neodani" value="" size="20" tabindex="1" accesskey="1"/></label>


SCRIPT
Código PHP:
Ver original
  1. $html='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  3. <head>
  4.     <title>Área restringida | Panel de Administración</title>
  5.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  6.     <meta name="robots" content="noindex,nofollow"/>
  7.     <link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
  8.     <!-- Favicon -->
  9.     <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  10. </head>
  11. <body class="login2">
  12.     <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  13.     <!-- Formulario Entrada -->
  14.     <div id="login">
  15.         <h1 id="titulo" title="Panel de Administración"></h1>
  16.  
  17.         <form id="loginform" action="includes/login.php" method="post">
  18.             <p>
  19.                 <label>Nombre de usuario<br />
  20.                 <input type="text" name="user" id="user_login" class="neodani" value="" size="20" tabindex="1" accesskey="1"/></label>
  21.             </p>
  22.             <p>
  23.                 <label class="prueba">Contraseña<br />
  24.                 <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  25.             </p>
  26.             <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  27.             <p class="submit">
  28.                 <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  29.             </p>
  30.         </form>
  31.         <p id="nav">
  32.             <a class="footer" href="#">Área privada.</a>
  33.         </p>
  34.     </div>
  35.     </body>
  36. </html>
  37. ';
  38.  
  39. function Extraer_Class_ID($html){
  40.     $clases = array();
  41.     $id = array();
  42.    
  43.     preg_match_all('/<(a|p|form|h1|label|input|div|body)[^>](?:(class)=["|\'](.*?)["|\'])|(?:(id)=["|\'](.*?)["|\'])[^>]*>/is',$html,$matches);
  44.    
  45.     //eliminamos los repetidos
  46.     $clases=array_unique($matches[3]);
  47.     $id=array_unique($matches[5]);
  48.    
  49.     //Quedara un valor en cada array en blanco, lo eliminamos así
  50.     foreach($clases as $item)
  51.     {
  52.         if ($item!=''){$resultado_class[] = $item;} // eliminamos los blancos
  53.     }
  54.     foreach($id as $item)
  55.     {
  56.         if ($item!=''){$resultado_id[] = $item;} // eliminamos los blancos
  57.     }
  58.    
  59.     return array($resultado_id,$resultado_class);
  60. }
  61.  
  62.  
  63. // Llamada del script
  64. $estilo=Extraer_Class_ID($html);
  65. echo "<pre>";
  66. echo "ID<br/>";
  67. print_r($estilo[0]);
  68. echo "<br/>CLASES<br/>";
  69. print_r($estilo[1]);
  70. echo "</pre>";
  71. ?>


Salida

Código:
ID
Array
(
    [0] => borde-top
    [1] => login
    [2] => titulo
    [3] => loginform
    [4] => user_login
    [5] => user_pass
    [6] => rememberme
    [7] => wp-submit
    [8] => nav
)

CLASES
Array
(
    [0] => login2
    [1] => enlace_top
    [2] => prueba
    [3] => forgetmenot
    [4] => submit
    [5] => footer
)
Sabéis como puedo hacer para que detecte los dos cuando aparecen dentro del mismo tag html?

Gracias de antemano!
  #20 (permalink)  
Antiguo 17/01/2010, 02:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

bueno, tampoco las expresiones regulares son todo el oro...

lo ideal sería que captures los atributos genéricamente, luego puedes hacer un sub-parsing de la información de los atributos... y descartar los que no utilices... ;)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #21 (permalink)  
Antiguo 17/01/2010, 06:02
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por pateketrueke Ver Mensaje
bueno, tampoco las expresiones regulares son todo el oro...

lo ideal sería que captures los atributos genéricamente, luego puedes hacer un sub-parsing de la información de los atributos... y descartar los que no utilices... ;)
Uhmm... como haces un sub-parsing de la información?

Si la salida del $matches[0] es la siguiente, con todas las coincidencias

Código:
    [0] => Array
        (
            [0] => <body class="login2"
            [1] => id="borde-top">
            [2] => <a class="enlace_top"
            [3] => id="login">
            [4] => id="titulo" title="Panel de Administración">
            [5] => id="loginform" action="includes/login.php" method="post">
            [6] => id="user_login" class="neodani" value="" size="20" tabindex="1" accesskey="1"/>
            [7] => <label class="prueba"
            [8] => id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" />
            [9] => <p class="forgetmenot"
            [10] => id="rememberme" value="forever" tabindex="90" />
            [11] => <p class="submit"
            [12] => id="wp-submit" value="Iniciar Sesión" tabindex="100" />
            [13] => id="nav">
            [14] => <a class="footer"
        )
Tu dices de parsear esa parte $matches[0] con otra expresión regular para conseguir sacar Ej. elemento [6]

[6] => id="user_login" class="neodani" value="" size="20" tabindex="1" accesskey="1"/>

El id y el class a la vez?

No se cómo hacer lo que te refieres :S:S

Salu2!
  #22 (permalink)  
Antiguo 17/01/2010, 10:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

si si, un sub-parsing es volver a implicar expresiones para extraer información, una ves tienes tus strings... puedes usar una expresión genérica para ello:
Cita:
/([^=])=(\'|\")(.+?)\\2/
así obtienes los atributos, y fácilmente puedes leer sus valores individualmente... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #23 (permalink)  
Antiguo 17/01/2010, 14:53
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Cita:
Iniciado por pateketrueke Ver Mensaje
si si, un sub-parsing es volver a implicar expresiones para extraer información, una ves tienes tus strings... puedes usar una expresión genérica para ello:


así obtienes los atributos, y fácilmente puedes leer sus valores individualmente... (:
pateketrueke

El resultado de aplicar esa expresión regular al string [6]

[6] => id="user_login" class="neodani" value="" size="20" tabindex="1" accesskey="1"/>

Es el siguiente, era ese el resultado que buscabas? no se distingue cual es una CLASS y cual es un ID

Por otro lado, que es lo que consigues o para que sirve poner el \\2?
/([^=])=(\'|\")(.+?)\\2/


Código:
<pre>Array
(
    [0] => Array
        (
            [0] => d="user_login"
            [1] => s="neodani"
            [2] => e="" size="
            [3] => x="1"
            [4] => y="1"
        )

    [1] => Array
        (
            [0] => d
            [1] => s
            [2] => e
            [3] => x
            [4] => y
        )

    [2] => Array
        (
            [0] => "
            [1] => "
            [2] => "
            [3] => "
            [4] => "
        )

    [3] => Array
        (
            [0] => user_login
            [1] => neodani
            [2] => " size=
            [3] => 1
            [4] => 1
        )

)
Muchas gracias de antemano!
  #24 (permalink)  
Antiguo 17/01/2010, 15:08
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

jajajja... y pensar que lo mio son las expresiones regulares...

prueba así:
Cita:
/\s*([a-zA-Z0-9:-]+)\s*=\s*([\'\"])?(.*?)(?(2)\\2)\s*(?:(?=\w+\s*=)|\s*$)\s*/
bueno, la expresión sirve en sí para capturar todos los atributos con sus respectivos valores... eso, sin salirse de si propio contexto...

la verdad se me hace un poco complicado, pero funciona...

los \\N significan que N es el sub-patrón capturado... en este caso ([\'\"]) es el segundo grupo... por ende, (?(2)\\2) significa algo así como "si se ha capturado la comilla de apertura (opcional) la podemos encontrar justo como cierre del valor en el atributo"

en realidad es mas divertido que complicado definir expresiones, y si, sin duda todo se encuentra en alguna referencia... solo hay que traducir poco a poco y reflexionar como se hacen bien... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #25 (permalink)  
Antiguo 19/01/2010, 12:56
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Buenas,

Vuelvo a la carga, esta vez con algo más sofisticado y útil... espero que me podáis echar una mano con un par de errores. Comparto el código con toda la comunidad! para aquel que quiera echar una mano.

Ejemplo de hoja de estilo y web. En el siguiente POST está el script (aquí no cabía)

web.htm

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
  3.     <title>Área restringida | Panel de Administración</title>
  4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5.     <meta name="robots" content="noindex,nofollow"/>
  6.     <link rel='stylesheet' href='/css/entrada_login.css' type='text/css' media='all' />
  7.     <!-- Favicon -->
  8.     <link rel="shortcut icon" href="/imagenes/favicon.ico"/>
  9.  
  10. </head>
  11.  
  12. <body class="login">
  13.     <p id="borde-top"><a href="entrada_login.php" title="Panel de Administración ME">ATENCIÓN: Área privada.</a></p>
  14.    
  15.     <!-- Formulario Entrada -->
  16.     <div id="login">
  17.         <h1 title="Panel de Administración ME"></h1>
  18.                    
  19.         <form id="loginform" action="includes/login.php" method="post">
  20.             <p>
  21.                 <label>Nombre de usuario<br />
  22.  
  23.                 <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  24.             </p>
  25.             <p>
  26.                 <label>Contraseña<br />
  27.                 <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  28.             </p>
  29.             <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  30.  
  31.             <p class="submit">
  32.                 <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  33.             </p>
  34.         </form>
  35.         <p id="nav">
  36.             <a href="#">Área privada.</a>
  37.         </p>
  38.     </div>
  39.  
  40.     </body>
  41. </html>


style.css

Código CSS:
Ver original
  1. * {
  2.     margin: 0;
  3.     padding: 0; }
  4.  
  5. body {
  6.     border-top-color: #EAF3FA; /* Color barra superior */
  7.     border-top-style: solid;
  8.     border-top-width: 30px;
  9.     color: #333333;
  10.     font-family: "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif; /*border-top-color:#464646; */
  11.     font-size-adjust: none;
  12.     font-size: 12px;
  13.     font-style: normal;
  14.     font-variant: normal;
  15.     font-weight: normal;
  16.     line-height: normal; }
  17.  
  18. /* PARTE DE ARRIBA (TOP)
  19. ------------------------------------------------- */
  20. #borde-top a {
  21.     color: #0090EF;
  22.     left: 15px;
  23.     position: absolute;
  24.     text-decoration: none;
  25.     top: 7px; }
  26.  
  27. .login #borde-top a:hover { color: #000; }
  28.  
  29. /* TITULO PRINCIPAL (LOGO)
  30. ------------------------------------------------- */
  31. h1 {
  32.     background: url(../imagenes/header/logo-acceso-panel.png) no-repeat;
  33.     display: block;
  34.     height: 40px;
  35.     margin-left: 15px;
  36.     overflow: hidden;
  37.     padding-bottom: 15px;
  38.     text-indent: -9999px;
  39.     width: 320px; }
  40.  
  41. /* FORMULARIO
  42. ------------------------------------------------- */
  43. form {
  44.     -khtml-border-radius: 5px;
  45.     -moz-border-radius: 5px;
  46.     -webkit-border-radius: 5px;
  47.     border-radius: 5px;
  48.     font-weight: bold;
  49.     margin-left: 8px;
  50.     padding: 16px 16px 40px 16px; }
  51.  
  52.     form p { margin-bottom: 24px; }
  53.  
  54. /* Tamaño del recuadro */
  55. #login {
  56.     margin: 7em auto;
  57.     width: 350px; }
  58.  
  59. /* Tamaño de las casillas USER Y PASS */
  60. #user_pass, #user_login {
  61.     font-size: 20px;
  62.     margin-right: 6px;
  63.     padding: 3px;
  64.     width: 97%; }
  65.  
  66. /* Color texto input */
  67. #login form input { color: #555555; }
  68.  
  69. /* Color de fondo LOGIN (azul claro) */
  70. .login form { background-color: #eee; }
  71.  
  72. /* CASILLA >> RECORDARME
  73. ------------------------------------------------- */
  74. form .forgetmenot {
  75.     float: left;
  76.     font-weight: normal;
  77.     margin-bottom: 0;
  78.     margin-left: 2px; }
  79.  
  80. /* BOTON >> INICIAR SESIÓN
  81. ------------------------------------------------- */
  82. #login form .submit input {
  83.     -khtml-border-radius: 3px;
  84.     -moz-border-radius: 3px;
  85.     -webkit-border-radius: 3px;
  86.     background-color: #CEE1EF;
  87.     border-color: #80B5D0;
  88.     border-radius: 3px;
  89.     border-style: solid;
  90.     border-width: 1px;
  91.     border: none;
  92.     color: #224466;
  93.     cursor: pointer;
  94.     float: right;
  95.     font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
  96.     font-size: 13px;
  97.     margin-top: -6px;
  98.     padding: 3px 5px;
  99.     text-decoration: none; }
  100.  
  101.     #login form .submit input:hover {
  102.         background-color: #9ACBEF;
  103.         border-color: #328AB2;
  104.         color: #FFF; }
  105.  
  106. /* FOOTER FORMULARIO
  107. ------------------------------------------------- */
  108. #nav {
  109.     margin: 0 0 0 8px;
  110.     padding: 16px;
  111.     text-align: center; }
  112.  
  113. .login #nav a { color: #777777;
  114.     color: #777777;
  115.     color: #777777;
  116.  }
  117. #myform form .login input:hover {
  118.         background-color: #9ACBEF;
  119.         border-color: #328AB2;
  120.         color: #FFF; }
  121. /* MENSAJES DE ERROR (FORMULARIO)
  122. ------------------------------------------------- */
  123. #login_error {
  124.     background-color: #FFEBE8;
  125.     border-color: #CC0000;
  126.     border-style: solid;
  127.     border-width: 1px;
  128.     margin: 0 0 13px 8px;
  129.     padding: 8px; }

Salida que produce ahora mismo

Código:
<pre>HTML<br/>Array
(
    [0] => html
    [1] => body
    [2] => p
    [3] => a
    [4] => div
    [5] => h1
    [6] => form
    [8] => label
    [9] => br
    [10] => input
)
ID<br/>Array
(
    [0] => borde-top
    [1] => login
    [2] => loginform
    [3] => user_login
    [4] => user_pass
    [5] => rememberme
    [6] => wp-submit
    [7] => nav
)
<br/>CLASS<br/>Array
(
    [0] => login
    [1] => forgetmenot
    [2] => submit
)
</pre><br/><br/> <strong>TAGS HTML</strong> <br/><br/>

body {
	border-top-color: #EAF3FA; /* Color barra superior */
	border-top-style: solid;
	border-top-width: 30px;
	color: #333333;
	font-family: "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif; /*border-top-color:#464646; */
	font-size-adjust: none;
	font-size: 12px;
	font-style: normal;
	font-variant: normal;
	font-weight: normal;
	line-height: normal; }
#borde-top a {
	color: #0090EF;
	left: 15px;
	position: absolute;
	text-decoration: none;
	top: 7px; }

.login #borde-top a:hover { color: #000; }

	form p { margin-bottom: 24px; }
#login form input { color: #555555; }
#login form .submit input {
	-khtml-border-radius: 3px;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	background-color: #CEE1EF;
	border-color: #80B5D0;
	border-radius: 3px;
	border-style: solid;
	border-width: 1px;
	border: none;
	color: #224466;
	cursor: pointer;
	float: right;
	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
	font-size: 13px;
	margin-top: -6px;
	padding: 3px 5px;
	text-decoration: none; }

	#login form .submit input:hover {
		background-color: #9ACBEF;
		border-color: #328AB2;
		color: #FFF; }
#myform form .login input:hover {
		background-color: #9ACBEF;
		border-color: #328AB2;
		color: #FFF; }
#borde-top a {
	color: #0090EF;
	left: 15px;
	position: absolute;
	text-decoration: none;
	top: 7px; }

.login #borde-top a:hover { color: #000; }
#nav {
	margin: 0 0 0 8px;
	padding: 16px;
	text-align: center; }

.login #nav a { color: #777777;
	color: #777777;
	color: #777777;
 }
h1 {
	background: url(../imagenes/header/logo-acceso-panel.png) no-repeat;
	display: block;
	height: 40px;
	margin-left: 15px;
	overflow: hidden;
	padding-bottom: 15px;
	text-indent: -9999px;
	width: 320px; }
form {
	-khtml-border-radius: 5px;
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	border-radius: 5px;
	font-weight: bold;
	margin-left: 8px;
	padding: 16px 16px 40px 16px; }

	form p { margin-bottom: 24px; }
#login form input { color: #555555; }
.login form { background-color: #eee; }
#login form input { color: #555555; }
#login form .submit input {
	-khtml-border-radius: 3px;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	background-color: #CEE1EF;
	border-color: #80B5D0;
	border-radius: 3px;
	border-style: solid;
	border-width: 1px;
	border: none;
	color: #224466;
	cursor: pointer;
	float: right;
	font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
	font-size: 13px;
	margin-top: -6px;
	padding: 3px 5px;
	text-decoration: none; }

	#login form .submit input:hover {
		background-color: #9ACBEF;
		border-color: #328AB2;
		color: #FFF; }
#myform form .login input:hover {
		background-color: #9ACBEF;
		border-color: #328AB2;
		color: #FFF; }<br/><br/> 

<strong>TAGS ID</strong> <br/><br/>borde-toploginloginformuser_loginuser_passremembermewp-submitnav<br/><br/> 

<strong>TAGS CLASS</strong> <br/><br/>loginforgetmenotsubmit
  #26 (permalink)  
Antiguo 19/01/2010, 12:58
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Continuo el POST anterior con el script y los errores que intento solucionar

super_parser.php

Código PHP:
Ver original
  1. <?
  2. /*
  3. Objetivo: Extraer todos los atributos HTML, y propiedades CSS (id y class)
  4. Para compararlos con una hoja de estilo y eliminar las propiedades que no se usen.
  5.  
  6. Archivo web.htm >> extraemos los atributos HTML, ID y CLASS
  7. Archivo style.css >> comparamos los atributos extraidos en el archivo web.htm
  8.                       y nos quedamos con la parte útil del fichero style.css
  9. */
  10.  
  11. function Extraer_Tags_HTML($file_html){
  12.     $html = file_get_contents($file_html);
  13.     // En el primer parantesis le decimos los tags que descarta
  14.     preg_match_all('/<(?!meta|title|head|link)(\w+)[^>]*\/?>/',$html,$matches);
  15.     $sin_duplicados=array_unique($matches[1]); //elimina los tags HTML repetidos
  16.    
  17.     return $sin_duplicados;
  18. }
  19.  
  20. function Extraer_Class_ID($file_html){
  21.     $html = file_get_contents($file_html);
  22.     $clases = array();
  23.     $id = array();
  24.    
  25.     preg_match_all('/<(a|p|form|h1|label|input|div|body)[^>](?:(class)=["|\'](.*?)["|\'])|(?:(id)=["|\'](.*?)["|\'])[^>]*>/is',$html,$matches);
  26.  
  27.     //eliminamos los repetidos
  28.     $clases=array_unique($matches[3]);
  29.     $id=array_unique($matches[5]);
  30.    
  31.     //Quedara un valor en cada array en blanco, lo eliminamos así
  32.     foreach($clases as $item){  if ($item!=''){$resultado_class[] = $item;} }
  33.     foreach($id as $item){  if ($item!=''){$resultado_id[] = $item;} }
  34.    
  35.     return array($resultado_id,$resultado_class);
  36. }
  37.  
  38. function parser_css ($file_css,$patron){
  39.     $css = file_get_contents($file_css);
  40.     preg_match_all("/[#\s\w:-]*$patron\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  41.    
  42.     return $matches[0];
  43. }
  44.  
  45. // -------- PROGRAMA -----------------
  46. $file_html='web.htm';
  47. $file_css='style.css';
  48. $css = file_get_contents($file_css);
  49.  
  50. // Imprime el array de tags HTML
  51. $tags_html=Extraer_Tags_HTML($file_html);
  52. $estilo=Extraer_Class_ID($file_html);
  53.  
  54. echo "<pre>";
  55. echo "HTML<br/>";
  56. print_r($tags_html);
  57. echo "ID<br/>";
  58. print_r($estilo[0]);
  59. echo "<br/>CLASS<br/>";
  60. print_r($estilo[1]);
  61. echo "</pre>";
  62.  
  63. // ---->> TAGS HTML
  64. echo "<br/><br/> <strong>TAGS HTML</strong> <br/><br/>";
  65. foreach($tags_html as $value){
  66.     preg_match_all("/[.\#\s\w:-]*$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  67.     foreach ($matches[0] as $propiedad){
  68.         echo $propiedad;
  69.     }
  70. }
  71. // ---->> TAGS ID
  72. echo "<br/><br/> <strong>TAGS ID</strong> <br/><br/>";
  73. foreach($estilo[0] as $value){
  74.     echo $value;
  75.     preg_match_all("/[\.#\s\w:-]*#\$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  76.     foreach ($matches[0] as $propiedad){
  77.         echo $propiedad;
  78.     }
  79. }
  80.  
  81. // ---->> TAGS CLASS
  82. echo "<br/><br/> <strong>TAGS CLASS</strong> <br/><br/>";
  83. foreach($estilo[1] as $value){
  84.     echo $value;
  85.     preg_match_all("/[\.#\s\w:-]*\.\$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  86.     foreach ($matches[0] as $propiedad){
  87.         echo $propiedad;
  88.     }
  89. }
  90.  
  91. ?>


La expresión regular de los tags ID

Código PHP:
Ver original
  1. preg_match_all("/[\.#\s\w:-]*#\$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);

Y la de los CLASS no funcionan como debería

Código PHP:
Ver original
  1. preg_match_all("/[\.#\s\w:-]*\.\$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);

Podéis echarme una mano, estoy seguro que es algo muy pequeño que se me está escapando y no lo veo

Muchas gracias de antemano!
  #27 (permalink)  
Antiguo 19/01/2010, 14:42
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Modificadas las expresiones regulares de los ID y CLASS, ahora creo que funcionan bien.

Código PHP:
Ver original
  1. // ---->> TAGS ID
  2. echo "<br/><br/> <strong>TAGS ID</strong> <br/><br/>";
  3. foreach($estilo[0] as $value){
  4.     preg_match_all("/[\.#\s\w:-]*#$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  5.     foreach ($matches[0] as $propiedad){
  6.         echo $propiedad;
  7.     }
  8. }
  9.  
  10. // ---->> TAGS CLASS
  11. echo "<br/><br/> <strong>TAGS CLASS</strong> <br/><br/>";
  12. foreach($estilo[1] as $value){
  13.     preg_match_all("/[\.#\s\w:-]*\.$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  14.     foreach ($matches[0] as $propiedad){
  15.         echo $propiedad;
  16.     }
  17. }


Sin embargo, la que da problemas es la de los tags HTML


Código PHP:
Ver original
  1. // ---->> TAGS HTML
  2. echo "<br/><br/> <strong>TAGS HTML</strong> <br/><br/>";
  3. foreach($tags_html as $value){
  4.     preg_match_all("/[.\#\s\w:-]*$value\s*[#\s\w:-]*\{[^\}]*\}/is",$css,$matches);
  5.     foreach ($matches[0] as $propiedad){
  6.         echo $propiedad;
  7.     }
  8. }

Me repite propiedades! es muy raro!

Ejemplo de la salida

Código CSS:
Ver original
  1. body {
  2.     border-top-color: #EAF3FA;
  3.     border-top-style: solid; /* Color barra superior */
  4.     border-top-width: 30px;
  5.     color: #333333;
  6.     font-family: "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif;
  7.     font-size-adjust: none; /*border-top-color:#464646; */
  8.     font-size: 12px;
  9.     font-style: normal;
  10.     font-variant: normal;
  11.     font-weight: normal;
  12.     line-height: normal; }
  13.  
  14. #borde-top a {
  15.     color: #0090EF;
  16.     left: 15px;
  17.     position: absolute;
  18.     text-decoration: none;
  19.     top: 7px; }
  20.  
  21. .login #borde-top a:hover { color: #000; }
  22.  
  23. form p { margin-bottom: 24px; }
  24.  
  25. #login form input { color: #555555; }
  26.  
  27. #login form .submit input {
  28.     -khtml-border-radius: 3px;
  29.     -moz-border-radius: 3px;
  30.     -webkit-border-radius: 3px;
  31.     background-color: #CEE1EF;
  32.     border-color: #80B5D0;
  33.     border-radius: 3px;
  34.     border-style: solid;
  35.     border-width: 1px;
  36.     border: none;
  37.     color: #224466;
  38.     cursor: pointer;
  39.     float: right;
  40.     font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
  41.     font-size: 13px;
  42.     margin-top: -6px;
  43.     padding: 3px 5px;
  44.     text-decoration: none; }
  45.  
  46.     #login form .submit input:hover {
  47.         background-color: #9ACBEF;
  48.         border-color: #328AB2;
  49.         color: #FFF; }
  50.  
  51. #myform form .login input:hover {
  52.     background-color: #9ACBEF;
  53.     border-color: #328AB2;
  54.     color: #FFF; }
  55.  
  56. #borde-top a {
  57.     color: #0090EF;
  58.     left: 15px;
  59.     position: absolute;
  60.     text-decoration: none;
  61.     top: 7px; }
  62.  
  63. .login #borde-top a:hover { color: #000; }
  64.  
  65. #nav {
  66.     margin: 0 0 0 8px;
  67.     padding: 16px;
  68.     text-align: center; }
  69.  
  70. .login #nav a {
  71.     color: #777777;
  72.     color: #777777;
  73.     color: #777777; }
  74.  
  75. h1 {
  76.     background: url(../imagenes/header/logo-acceso-panel.png) no-repeat;
  77.     display: block;
  78.     height: 40px;
  79.     margin-left: 15px;
  80.     overflow: hidden;
  81.     padding-bottom: 15px;
  82.     text-indent: -9999px;
  83.     width: 320px; }
  84.  
  85. form {
  86.     -khtml-border-radius: 5px;
  87.     -moz-border-radius: 5px;
  88.     -webkit-border-radius: 5px;
  89.     border-radius: 5px;
  90.     font-weight: bold;
  91.     margin-left: 8px;
  92.     padding: 16px 16px 40px 16px; }
  93.  
  94.     form p { margin-bottom: 24px; }
  95.  
  96. #login form input { color: #555555; }
  97.  
  98. .login form { background-color: #eee; }
  99.  
  100. #login form input { color: #555555; }
  101.  
  102. #login form .submit input {
  103.     -khtml-border-radius: 3px;
  104.     -moz-border-radius: 3px;
  105.     -webkit-border-radius: 3px;
  106.     background-color: #CEE1EF;
  107.     border-color: #80B5D0;
  108.     border-radius: 3px;
  109.     border-style: solid;
  110.     border-width: 1px;
  111.     border: none;
  112.     color: #224466;
  113.     cursor: pointer;
  114.     float: right;
  115.     font-family: "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
  116.     font-size: 13px;
  117.     margin-top: -6px;
  118.     padding: 3px 5px;
  119.     text-decoration: none; }
  120.  
  121.     #login form .submit input:hover {
  122.         background-color: #9ACBEF;
  123.         border-color: #328AB2;
  124.         color: #FFF; }
  125.  
  126. #myform form .login input:hover {
  127.     background-color: #9ACBEF;
  128.     border-color: #328AB2;
  129.     color: #FFF; }

Esta la repite 3 veces!
#login form input { color: #555555; }

Y muchas 2 veces como estas de aquí, es muy raro!!

#borde-top a {
color: #0090EF;
left: 15px;
position: absolute;
text-decoration: none;
top: 7px; }

.login #borde-top a:hover { color: #000; }
  #28 (permalink)  
Antiguo 21/01/2010, 01:07
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Buenas,

Vuelvo a recurrir a vosotros, necesito una pequeña ayuda. Hay un fallo en la expresión regular que no me permite coger bien la clase cuando esta formada de la siguiente manera:

Me debería sacar que hay dos clases (estilo1 y estilo2). Sin embargo solo me encuentra una.


Código PHP:
Ver original
  1. $html2='<p class="estilo1"><label><input name="rememberme" type="checkbox" id="rememberme" class="estilo2" value="forever" tabindex="90" /> Recordarme</label></p>';
  2.  
  3. preg_match_all('/<([a-zA-Z0-9]+)[^>](?:(class)=["|\'](.*?)["|\'])*>/is',$html2,$matches);
  4.  
  5. echo "<pre>";
  6. print_r($matches);
  7. echo "</pre>";

Salida
Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <p class="estilo1">
            [1] => <label>
        )

    [1] => Array
        (
            [0] => p
            [1] => labe
        )

    [2] => Array
        (
            [0] => class
            [1] => 
        )

    [3] => Array
        (
            [0] => estilo1
            [1] => 
        )

)
</pre>
¿Podéis ayudarme?

Muchas gracias de antemano
  #29 (permalink)  
Antiguo 21/01/2010, 14:11
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Encontrar etiquetas html, class y id's (con expresiones regulares)

Yuhuu!

Primera parte completada con éxito

Código PHP:
Ver original
  1. <?
  2. /*
  3. Objetivo: Extraer todos los atributos HTML, y propiedades CSS (id y class)
  4. Para compararlos con una hoja de estilo y eliminar las propiedades que no se usen.
  5.  
  6. Archivo web.htm >> extraemos los atributos HTML, ID y CLASS
  7. Archivo style.css >> comparamos los atributos extraidos en el archivo web.htm
  8.                       y nos quedamos con la parte útil del fichero style.css
  9. */
  10.  
  11. // -------- PROGRAMA -----------------
  12. $file_html='web.htm';
  13. $file_css='style.css';
  14.  
  15. $html = file_get_contents($file_html);
  16. $css = file_get_contents($file_css);
  17.  
  18. preg_match_all('/<(\w+)[^>]*class=[\'|"](\w+)[\'|"][^>]*>/is',$html,$matches_class);
  19. preg_match_all('/<(\w+)[^>]*id=[\'|"](\w+)[\'|"][^>]*>/is',$html,$matches_id);
  20.  
  21. $tags_html = array_merge($matches_class[1], $matches_id[1]); // Junto los dos arrays en uno
  22. $del_dup_html=array_unique($tags_html); // HTML
  23. $del_dup_class=array_unique($matches_class[2]); // CLASS
  24. $del_dup_id=array_unique($matches_id[2]); // ID
  25.  
  26. echo "<pre>";
  27. print_r($del_dup_html);
  28. echo "</pre>";
  29.  
  30. echo "<pre>";
  31. print_r($del_dup_class);
  32. echo "</pre>";
  33.  
  34. echo "<pre>";
  35. print_r($del_dup_id);
  36. echo "</pre>";
  37.  
  38. ?>

Si veis algún fallo por favor comunicádmelo, muchas gracias a todos

Mención especial a pateketrueke por estar al pie del cañón, gracias por tus consejos.

Ahora queda la segunda parte
Hacer matching con la hoja de estilo y descartar los estilos que no estén en nuestra web.

Etiquetas: class, encontrar, etiquetas, expresiones, html, regulares
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 10:48.