Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Probador de expresiones regulares (https://www.clubdelphi.com/foros/showthread.php?t=75971)

Ñuño Martínez 30-09-2011 13:53:40

Probador de expresiones regulares
 
Que levanten la mano aquellos que, como yo, sean incapaces de hacer una expresión regular que funcione.

Bueno, pues hoy he tenido esa necesidad para un programa relativamente complejo, y para probar se me ha ocurrido hacer un archivo PHP la mar de majo. Ya verás tú qué cosa:
Código PHP:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  <title>Probador de expresiones regulares</title>
 </head>
<?php
  $Coincidencias 
= array ();
  
$NumCoincidencias 0;
# Obtiene los datos del formulario y los filtra para evitar juankeos.
  
$Expresion = isset ($_POST['expresion']) ? $_POST['expresion'] : '';
  
$Cadena = isset ($_POST['cadena']) ? $_POST['cadena'] : '';
  
$ExpresionPublica htmlentities ($ExpresionENT_COMPAT'utf-8');
  
$CadenaPublica htmlentities ($CadenaENT_COMPAT'utf-8');
 
?>
 <body>
  <h1>Probador de expresiones regulares.</h1>
  <p>Las expresiones regulares siempre se me han atragandado.&nbsp; Este pequeño programa ayuda mucho porque permite comprobar <em>in situ</em> las expresiones regulares.&nbsp; Para ello utiliza <a href="http://es2.php.net/manual/function.preg-match.php">la función <code>preg_match</code> de PHP</a>.</p>
  <p>Como referencia a las expresiones regulares usadas con PHP, la <a href="http://www.mclibre.org/consultar/php/lecciones/php_expresiones_regulares.html">página de Bartolomé Sintes Marco</a>.</p>
  <form action="" method="post">
   <fieldset>
    <p><label for="expresion">Expresión:</label> <input type="text" id="expresion" name="expresion" value="<?php echo $ExpresionPublica ?>" /></p>
    <p><label for="cadena">Cadena:</label> <input type="text" id="cadena" name="cadena" value="<?php echo $CadenaPublica ?>" /></p>
    <p><input type="submit" /></p>
   </fieldset>
  </form>
<?php
  
if ($Expresion <> '' and $Cadena <> ''):
  
# Redundante redundancia...
    
if (preg_match ("/^\/.*\/$/"$Expresion) < 1):
 
?>
  <p>La expresión ha de estar delimitada por <code>'/'</code>.&nbsp; Por ejemplo: <code>/<?php echo $ExpresionPublica ?>/</code>.</p>
<?php
    
else:
      if (@
preg_match ($Expresion$Cadena$Coincidencias) > 0):
        
$NumCoincidencias count ($Coincidencias);
      
# De nuevo filtramos para evitar juankeos.
        
foreach ($Coincidencias as $Ndx => $Resultado)
          
$Coincidencias[$Ndx] = htmlentities ($ResultadoENT_COMPAT'utf-8');
      endif;
 
?>
  <table border="1" cellpadding="4" cellspacing="0" style="margin-top: 10px; width: 100%"><tbody>
   <tr>
    <th>Expresión</th>
    <td><code><?php echo $ExpresionPublica ?></code></td>
   </tr><tr>
    <th>Cadena</th>
    <td>"<?php echo $CadenaPublica ?>"</td>
   </tr><tr>
    <th>Número de coincidencias</th>
    <td><?php echo $NumCoincidencias ?></td>
   </tr><tr>
    <th valign="top">Coincidencias</th>
    <td><pre><?php var_dump ($Coincidencias?></pre></td>
   </tr>
  </tbody></table>
<?php
    
endif;
  endif;
 
?>
 </body>
</html>

Un detalle: si no usáis UTF-8, no olvidéis buscar y sustituir "utf-8" por la codificación que uséis (en Windows suele ser "iso-8859-1", si no recuerdo mal), o de lo contrario podría hacer cosas raras.

Lo de los "juankeos" viene de "juankear" que es la castellanización del inglés to hack. He probado varias técnicas para juankearlo y no he sido capaz, así que no sé por qué otros programas PHP usan cienes y cienes de líneas para hacer lo mismo si con htmlentities ya basta...

En parte lo pongo aquí por no perderlo (estoy en el trabajo, y ahora no tengo otro sitio donde ponerlo) pero también para que la gente lo use, si quiere. Esta tarde, si puedo, lo subo a mi webería por si queréis probarlo.

Casimiro Noteví 30-09-2011 15:16:05

Oye, y eso de "Obtiene los datos del formulario y los filtra para evitar juankeos." ¿dónde se estudia?.
¿Hay que tener en cuenta esas cosas y las de "injection sql" para cualquier web?, ¿así están las cosas?
¿Dónde puedo encontrar información de esas cosas?, a ser posible en andaluz, aunque también me vale en castellano o español, es que uno es multilingüe :)

roman 30-09-2011 17:14:00

Creo que un probador de expresiones regulares debería incluir una llamada a preg_quote.

// Saludos

Ñuño Martínez 03-10-2011 10:35:28

Cita:

Empezado por Casimiro Notevi (Mensaje 414164)
Oye, y eso de "Obtiene los datos del formulario y los filtra para evitar juankeos." ¿dónde se estudia?.
¿Hay que tener en cuenta esas cosas y las de "injection sql" para cualquier web?, ¿así están las cosas?
¿Dónde puedo encontrar información de esas cosas?, a ser posible en andaluz, aunque también me vale en castellano o español, es que uno es multilingüe :)

Yo soy de la opinión de que no siempre es necesario hacer comprobaciones para evitar inyectiones de código (sea este SQL, JavaScript, PHP o Brainf*ck), sino sólo cuando sea necesario.

Por ejemplo, en este comprobador es absurdo buscar y anular inyecciones de código SQL, porque no se hace referencia alguna a bases de datos. Simplemente me limito a evitar que metan código JavaScript.

En cuanto a dónde buscar información, pues hay varios sitios. La propia documentación oficial de PHP en http://www.php.net ya da muchísimas pistas. Posiblemente en W3Schools también haya información, pero digo "posiblemente" porque ni lo he mirado (hasta ahora esta web sólo la consulto para HTML, CSS y JavaScript).

Cita:

Empezado por roman (Mensaje 414183)
Creo que un probador de expresiones regulares debería incluir una llamada a preg_quote.

// Saludos

Es posible, pero he preferido no hacerlo. De esta forma se puede controlar exactamente qué cadena va ha comprobarse, y si está mal construida fallará.

De todas formas, no es difícil añadirlo, o incluso que haga dos comprobaciones, una con "preg_quote" y otra sin ella, y que muestre ambos resultados.


La franja horaria es GMT +2. Ahora son las 05:38:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi