Aucune référence trouvée !
<?php
/**
 * @file index.php
 * @brief Page d'extraction de références Legrand depuis un fichier XML
 *
 * Ce fichier s'exécute via http.
 * Les fichiers XML à traiter sont à déposer dans son répertoire.
 *
 * @since 2007-01-31
 * @date 2007-02-01
 * @author hughes monget
 * @see http://monget.com/
 */
// Explication de l'expression régulière de capture des références.
/*
    /                début
    (?<=")           assertion non capturante: le " doit réussir à gauche
    0                est suivi par 0
    [0-9*.+-]        classe de caractères possibles dans une référence (le - doit être en début ou en fin de classe)
    {5,}             au moins 5 caractères de la classe précédente
    (?=")            assertion non capturante: le " doit réussir à droite
    /                fin
*/
define('STR_REGEX', '/(?<=")0[0-9*.+-]{5,}(?=")/');
// Nom du paramètre http "fichier".
define('STR_FICHIER', 'fichier');
// On modifie quelques paramètres php.
error_reporting(E_ALL | E_NOTICE | E_STRICT); // Pour augmenter le niveau des erreurs.
ini_set('date.timezone', 'Europe/Paris');     // Pour les fonctions de dates.
ini_set('arg_separator.output', '&');     // Pour http_build_query.
setlocale(LC_ALL, 'French');                  // Pour forcer les locals.
set_time_limit(0);                            // Pour éviter un timeout.
// Callback de comparaison pour le tri des références.
// (tri par longueur puis alphabétique)
function comparer_reference($str_gauche, $str_droite)
{
    $int_gauche = strlen($str_gauche);
    $int_droite = strlen($str_droite);
    if ($int_gauche == $int_droite)
    {
        return strcmp($str_gauche, $str_droite);
    }
    else
    {
        return $int_gauche - $int_droite;
    }
}
// On récupère la liste des fichiers xml du répertoire courant.
$arr_str_liste_fichier_xml = glob('*.xml'); // En principe sensible à la casse !
// On démarre la bufférisation.
ob_start();
if (!$arr_str_liste_fichier_xml)
{
    echo 'Pas de fichier xml trouvé dans le répertoire !';
}
else
{
    // On teste si le paramètre http "fichier" a été reçu par la page.
    if (empty($_REQUEST[STR_FICHIER]))
    {
        // On afficher la liste des fichiers XML du répertoire.
        echo '<ul>';
        foreach ($arr_str_liste_fichier_xml as $str_fichier)
        {
                echo '<li><a href="' . $_SERVER['SCRIPT_NAME'] . '?' . STR_FICHIER . '=' . urlencode($str_fichier) . '">' . htmlspecialchars($str_fichier) . '</a></li>';
        }
        echo '</ul>';
    }
    else
    {
        $str_fichier = $_REQUEST[STR_FICHIER];
        if (get_magic_quotes_gpc()) // Pour être indépendant des magic quotes
        {
            $str_fichier = stripslashes($str_fichier);
        }
        // On teste si le fichier existe et est autorisé en lecture.
        $str_fichier = realpath($str_fichier);
        if (FALSE === $str_fichier || !is_file($str_fichier) || !is_readable($str_fichier)                       // Fichier régulier ?
                || strcmp(dirname(__FILE__) . DIRECTORY_SEPARATOR, dirname($str_fichier) . DIRECTORY_SEPARATOR)) // On simule une option open_base_dir
        {
            echo 'Fichier non trouvé !';
        }
        else
        {
            // On charge le fichier reçu en paramètre.
            $str_contenu = file_get_contents($str_fichier);
            if (FALSE === $str_contenu)
            {
                echo 'Problème de lecture du fichier !';
            }
            else
            {
                // On capture les références.
                if (FALSE === preg_match_all(STR_REGEX, $str_contenu, $arr_str_match) || !isset($arr_str_match[0]))
                {
                    echo 'Problème de syntaxe ou de capture avec l\'expression régulière !';
                }
                else
                {
                    // La capture s'est bien déroulée.
                    $arr_str_liste_reference = $arr_str_match[0];
                    if (!$arr_str_liste_reference)
                    {
                        echo 'Aucune référence trouvée !';
                    }
                    else
                    {
                        // On traite notre liste de références trouvées.
                        $arr_str_liste_reference = array_unique($arr_str_liste_reference);                  // Suppression des doublons.
                        usort($arr_str_liste_reference, 'comparer_reference');
                        $arr_str_liste_reference = array_map('htmlspecialchars', $arr_str_liste_reference); // Encodage html
                        // On affiche les références.
                        echo implode("\n", $arr_str_liste_reference);
                    }
                }
            }
        }
    }
}
// Affichage de la page html.
header('Content-Type: text/html; charset=ISO-8859-1');
echo str_replace('{BODY}', ob_get_clean(), <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Extraire les références des fichiers xml</title>
        <style type="text/css">
        <!--
        -->
        </style>
    </head>
    <body>
<pre>
{BODY}
</pre>
HTML
);
echo '<hr />';
highlight_file(__FILE__);
echo '</body></html>';