Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/01/2010, 14:50
Avatar de neodani
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!