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 ($Expresion, ENT_COMPAT, 'utf-8');
$CadenaPublica = htmlentities ($Cadena, ENT_COMPAT, 'utf-8');
?>
<body>
<h1>Probador de expresiones regulares.</h1>
<p>Las expresiones regulares siempre se me han atragandado. Este pequeño programa ayuda mucho porque permite comprobar <em>in situ</em> las expresiones regulares. 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>. 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 ($Resultado, ENT_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.