Foros del Web » Programando para Internet » PHP »

Duda expresion regular, resultado distinto...

Estas en el tema de Duda expresion regular, resultado distinto... en el foro de PHP en Foros del Web. Buenas, Encontré esta página http://www.rubular.com/ donde probar las expresiones regulares, su diseño y usabilidad me gustaron, tanto que me puse a diseñar una expresión regular ...
  #1 (permalink)  
Antiguo 21/01/2010, 12:52
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Duda expresion regular, resultado distinto...

Buenas,

Encontré esta página http://www.rubular.com/ donde probar las expresiones regulares, su diseño y usabilidad me gustaron, tanto que me puse a diseñar una expresión regular hasta que conseguí que me cogiese todos los valores que quería.

La expresión regular

Código PHP:
Ver original
  1. <(\w+)(?:.*?)class=[\'|"](\w+)[\'|"](?:.*?)>

Fragmento de codigo html probado
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. </head>
  10. <body class="login">
  11.     <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  12.     <!-- Formulario Entrada -->
  13.     <div id="login">
  14.         <h1 id="titulo" title="Panel de Administración"></h1>
  15.  
  16.         <form id="loginform" action="includes/login.php" method="post">
  17.             <p>
  18.                 <label>Nombre de usuario<br />
  19.                 <input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/></label>
  20.             </p>
  21.             <p>
  22.                 <label>Contraseña<br />
  23.                 <input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" /></label>
  24.             </p>
  25.             <p class="forgetmenot"><label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>
  26.             <p class="submit">
  27.                 <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
  28.             </p>
  29.         </form>
  30.         <p id="nav">
  31.             <a class="footer" href="#">Área privada.</a>
  32.         </p>
  33.     </div>
  34.     </body>
  35. </html>

En la web me muestra el resultado que quiero. Todas valores de los elementos CLASS y el tag HTML que le precede.

Código:
Result 1

   1. body
   2. login

Result 2

   1. p
   2. enlace_top

Result 3

   1. input
   2. input

Result 4

   1. input
   2. input

Result 5

   1. p
   2. forgetmenot

Result 6

   1. p
   2. submit

Result 7

   1. a
   2. footer
Sin embargo, cuando ejecuto esa misma expresión en una pagina php, el resultado es bien distinto.

Código:
<pre>Array
(
    [0] => Array
        (
            [0] => <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
<head>
	<title>Área restringida | Panel de Administración</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="robots" content="noindex,nofollow"/>
	<link rel="stylesheet" href="/css/entrada_login.css" type="text/css" media="all" />
	<!-- Favicon -->
	<link rel="shortcut icon" href="/imagenes/favicon.ico"/>
</head>

<body class="login">
            [1] => <p id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">
            [2] => <div id="login">
		<h1 id="titulo" title="Panel de Administración"></h1>

		<form id="loginform" action="includes/login.php" method="post">
			<p>
				<label>Nombre de usuario<br />

				<input type="text" name="user" id="user_login" class="input" value="" size="20" tabindex="1" accesskey="1"/>
            [3] => <p>
				<label>Contraseña<br />
				<input type="password" name="password" id="user_pass" class="input" value="" size="20" tabindex="2" accesskey="2" />
            [4] => <p class="forgetmenot">
            [5] => <label><input name="rememberme" type="checkbox" id="rememberme" value="forever" tabindex="90" /> Recordarme</label></p>

			<p class="submit">
            [6] => <input type="submit" name="wp-submit" id="wp-submit" value="Iniciar Sesión" tabindex="100" />
			</p>
		</form>
		<p id="nav">
			<a class="footer" href="#">
        )

    [1] => Array
        (
            [0] => html
            [1] => p
            [2] => div
            [3] => p
            [4] => p
            [5] => label
            [6] => input
        )

    [2] => Array
        (
            [0] => login
            [1] => enlace_top
            [2] => input
            [3] => input
            [4] => forgetmenot
            [5] => submit
            [6] => footer
        )

)
</pre>
A pesar que los valores de los CLASS son correctos, los atributos HTML no coinciden con los mostrados haciendo la prueba en la web.

body
p
input
input
p
p
a


¿Sabéis porque puede ser?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 21/01/2010, 13:02
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Duda expresion regular, resultado distinto...

tus expresiones siguen siendo muy permisivas...

osea, el .* indica lo que sea!! (y por ello tu error)

debes usar expresiones mas cercanas a la realidad, no muy "abiertas"

por ejemplo, cambia los (?:.*?) por [^>]* a ver que sucede... ;)

NOTA que es mejor decir "lo que no puede ser" a "todo lo que sea"
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 21/01/2010, 13:51
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda expresion regular, resultado distinto...

Cita:
Iniciado por pateketrueke Ver Mensaje
tus expresiones siguen siendo muy permisivas...

osea, el .* indica lo que sea!! (y por ello tu error)

debes usar expresiones mas cercanas a la realidad, no muy "abiertas"

por ejemplo, cambia los (?:.*?) por [^>]* a ver que sucede... ;)

NOTA que es mejor decir "lo que no puede ser" a "todo lo que sea"
Tenias razón :) funcionó de esta manera.

Prometo intentar no ser tan "abierto" en las expresiones ;)

Mil gracias, poco a poco voy construyendo lo que quiero... a ver si no encuentro más problemas.....
  #4 (permalink)  
Antiguo 21/01/2010, 15:24
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda expresion regular, resultado distinto...

Joerrrr..... creía que estaba pero no.

No me detecta el id=border-top no entiendo que tiene de diferente con el id="login" que si lo coge.

Código HTML:
Ver original
  1. <div id="estilo1">tesssssst</div>
  2. <div id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  3.     <!-- Formulario Entrada -->
  4.     <div id="login">
  5.         <h1 id="titulo" title="Panel de Administración"></h1>


Código PHP:
Ver original
  1. preg_match_all('/<(\w+)[^>]*id=[\'|"](\w+)[\'|"][^>]*>/is',$html,$matches_id);

Salida. Falta el border_top

Código:
Array
(
    [0] => estilo1
    [1] => login
    [2] => titulo
)
A que es debido?¿? me estoy volviendo loco con esto

Gracias de antemano!
  #5 (permalink)  
Antiguo 21/01/2010, 15:34
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda expresion regular, resultado distinto...

Cita:
Iniciado por neodani Ver Mensaje
Joerrrr..... creía que estaba pero no.

No me detecta el id=border-top no entiendo que tiene de diferente con el id="login" que si lo coge.

Código HTML:
Ver original
  1. <div id="estilo1">tesssssst</div>
  2. <div id="borde-top"><a class="enlace_top" href="entrada_login.php" title="Panel de Administración">ATENCIÓN: Área privada.</a></p>
  3.     <!-- Formulario Entrada -->
  4.     <div id="login">
  5.         <h1 id="titulo" title="Panel de Administración"></h1>


Código PHP:
Ver original
  1. preg_match_all('/<(\w+)[^>]*id=[\'|"](\w+)[\'|"][^>]*>/is',$html,$matches_id);

Salida. Falta el border_top

Código:
Array
(
    [0] => estilo1
    [1] => login
    [2] => titulo
)
A que es debido?¿? me estoy volviendo loco con esto

Gracias de antemano!
Es debido a que lleva un guion medio la palabra y la expresión regular no lo coge como una \w (palabra válida)

Solucionado sustituyéndolo (\w+) por ([-_a-zA-Z0-9]+)

Salu2!

Etiquetas: distinto, expresion, regular, resultados
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 23:05.