Wikini

TesterLesRegExpEnPHP

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-54-242-115-55.compute-1.amazonaws.com
J'ai écrit un petit bout de code qui commence à grossir et qui permet de tester une expression rationnelle sur un texte donné (avec une petite interface où l'on entre le texte et l'expression).
Je le trouve assez utile mais aussi largement perfectible, c'est pourquoi je le place ici pour ceux qui auraient envie de l'utiliser et/ou de l'améliorer.

ATTENTION ! Ce script n'est surtout pas à utiliser sur un serveur de production !! Il offre à un pirate la possibilité de prendre le contrôle de votre machine.


<?php

/*
reg_exp.php 0.3 du 03/04/2004
par Charles Népote <charles02@nepote.org>
remanié par Progfou <jean-christophe.andre@auf.org>
Licence GPL

Attention ! Ce script n'est pas sécurisé et peut offrir à un pirate la
possibilité de prendre le contrôle de système d'exploitation (rien de moins)
Nous vous recommandons de l'employer en connaissance de cause et nous
recommandons de ne pas l'employer sur un serveur de production.

TODO :
-- temps de traitement -- NdProgFou : à faire sur 500 appels par exemple

BUGS : (chercher XXX dans le source)

*/

$OPTS = Array("U""ms");

if (
$_SERVER["REQUEST_METHOD"] == "POST") {
    
$body stripslashes($_POST["body"]);
    
$pattern stripslashes($_POST["pattern"]);
    
$opt stripslashes($_POST["opt"]);
    if (
$opt || count($OPTS) <= $opt$opt 0;
} else {
    
$body "<b>Exemple :</b> ceci\nest <i>un exemple assez curieux</i>.";
    
$pattern "<[^>]+>([^ ]*)( [^ <]*)*</[^>]+>";
    
$opt 0;
}

// fonction pour construire un select à partir de ses nom et options
function make_select($name$options$selected "")
{
    
$result "";
    foreach (
$options as $key => $value) {
        
$result .= "<option value=\"".htmlspecialchars($key)."\"";
        if (
$key == $selected$result .= " selected";
        
$result .= ">".htmlspecialchars($value)."</option>";
    }
    return 
"<select name=\"".$name."\">".$result."</select>";
}
?>

<html>
<head>
<title>Test d'expression r&eacute;guli&egrave;re</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</head>
<style type="text/css">
h1 { color: blue } html { margin: 10px; }
html { line-height: 0.8em; }
pre.analyse { line-height: 2em; }
.fluo { background: yellow; }
.box { border: thin dashed; padding: 1px; }
</style>
<body>
<h1>Test d'expression r&eacute;guli&egrave;re</h1>
<form action="<?= $PHP_SELF ?>" method="post">

<h2>Texte&nbsp;:</h2>
<textarea name="body" cols="80" rows="10" wrap="soft">
<?= htmlspecialchars($body?>
</textarea>
<br />

<p style="border: thin dashed; padding: 10px; ">
preg_match_all("|<input type="text" size="50" name="pattern" value="<?= htmlspecialchars($pattern?>" />|<?= make_select("opt"$OPTS$opt?>", ...)
<input name="submit" type="submit" value="Tester" />
</p>
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && $pattern != "")
{
    
preg_match_all("|".$pattern."|".$OPTS[opt], $body$matches,
        
PREG_SET_ORDER);
    
// l'analyse
    
echo "<hr />\n<pre class=\"analyse\">\n";
    foreach (
$matches as $match)
    {
        
// on découpe le body au niveau du match
        
$milieu $match[0];
        list(
$gauche$body) = split($milieu$body);
        echo 
htmlspecialchars($gauche),"<span class=\"fluo\">";
        
// on découpe le match suivant les parenthèses fournies
        // XXX: ne gère pqs les parenthèses imbriquées !!
        
$milieux $match;
        unset(
$milieux[0]);
        foreach (
$milieux as $m)
        {
            list(
$gauche,$milieu) = split($m$milieu);
            echo 
htmlspecialchars($gauche),"<span class=\"box\">",
                 
htmlspecialchars($m),"</span>";
        }
        echo 
htmlspecialchars($milieu),"</span>";
        unset(
$milieux);
    }
    echo 
htmlspecialchars($body);
    echo 
"</pre>\n";
    
// le découpage d'origine
    
echo "<hr />\n<pre>\n";
    
print_r($matches);
    echo 
"</pre>\n";
}
?>

</body>
</html>
?>


-- CharlesNepote


Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]