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>';