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''&amp;');     // 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_SEPARATORdirname($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>';