alpha_full/admin/adminInclude/Outillage/analyseDesLiens-chatGPT.php
2026-04-06 22:58:51 +02:00

226 lines
7.2 KiB
PHP
Executable File

<?php
$nomFicAppelant = basename(__FILE__);
// analyseDesLiens.php
// Chargement de PhpSpreadsheet
require '/datas/07Prod/include/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
// Déclaration des variables
$racineAnalyse = '/datas/07Prod/wwwRoot/alpha.wbadm/';
$dossierOutillage = '/datas/07Prod/wwwRoot/alpha.wbadm/admin/adminInclude/Outillage/';
$tableau1 = [];
$tableau2 = [];
$tableau3 = [];
// Fonction pour nettoyer les chemins
function nettoyerChemin($chemin) {
return str_replace('//', '/', $chemin);
}
// Fonction pour scanner les fichiers PHP
function scannerFichiersPhp($dir) {
$fichiers = [];
$elements = scandir($dir);
foreach($elements as $element) {
if($element !== '.' && $element !== '..') {
$chemin = nettoyerChemin($dir . '/' . $element);
if(is_dir($chemin)) {
$fichiers = array_merge($fichiers, scannerFichiersPhp($chemin));
} elseif(is_file($chemin)) {
if(pathinfo($chemin, PATHINFO_EXTENSION) === 'php' && basename($chemin) !== 'gallerie.php') {
if(strpos($chemin, 'admin/adminInclude/Outillage') === false) {
$fichiers[] = $chemin;
}
}
}
}
}
return $fichiers;
}
// Etape 1 : Remplir tableau1
$tableau1 = scannerFichiersPhp($racineAnalyse);
// Etape 2 : Remplir tableau2 avec includes et $src
foreach($tableau1 as $cheminFichier) {
$relatif = str_replace($racineAnalyse, '/', $cheminFichier);
$relatif = nettoyerChemin($relatif);
$contenu = @file($cheminFichier);
if($contenu === false) continue;
foreach($contenu as $numLigne => $ligne) {
if(preg_match_all('/include(?:_once)?\s*\(\s*[\'"]([^\'"]+)[\'"]\s*\)/i', $ligne, $matches)) {
foreach($matches[1] as $fichierInclu) {
$tableau2[] = [
'fichierContenant' => $relatif,
'fichierIncludé' => basename($fichierInclu),
'numeroLigne' => $numLigne + 1
];
}
}
if(preg_match_all('/\$src\s*=\s*[\'"]([^\'"]+)[\'"]/i', $ligne, $matches)) {
foreach($matches[1] as $fichierSrc) {
$tableau2[] = [
'fichierContenant' => $relatif,
'fichierIncludé' => basename($fichierSrc),
'numeroLigne' => $numLigne + 1
];
}
}
}
}
// Etape 3 : Remplir tableau3 avec liens href ou javascript location
foreach($tableau1 as $cheminFichier) {
$relatif = str_replace($racineAnalyse, '/', $cheminFichier);
$relatif = nettoyerChemin($relatif);
$nomFichier = basename($cheminFichier);
$contenu = @file($cheminFichier);
if($contenu === false) continue;
foreach($contenu as $numLigne => $ligne) {
if(preg_match_all('/href\s*=\s*[\'"]([^\'"]+)[\'"]/i', $ligne, $matches)) {
foreach($matches[1] as $lien) {
if(!preg_match('/^(http|#|mailto:|tel:)/i', $lien)) {
$tableau3[] = [
'cheminDufichierComplet' => $relatif,
'fichierContenantLeLien' => $nomFichier,
'lien' => $lien,
'numeroLigne' => $numLigne + 1
];
}
}
}
if(preg_match_all('/(document|top|self|parent)\.location\.href\s*=\s*[\'"]([^\'"]+)[\'"]/i', $ligne, $matches)) {
foreach($matches[2] as $lien) {
if(!preg_match('/^(http|#|mailto:|tel:)/i', $lien)) {
$tableau3[] = [
'cheminDufichierComplet' => $relatif,
'fichierContenantLeLien' => $nomFichier,
'lien' => $lien,
'numeroLigne' => $numLigne + 1
];
}
}
}
}
}
// Etape 4 : Trouver Parent, GrandParent, Ailleul
foreach($tableau3 as $key => &$entry) {
$fichier = $entry['fichierContenantLeLien'];
$entry['fichierParent'] = '';
$entry['grandParent'] = '';
$entry['ailleul'] = '';
foreach($tableau2 as $row) {
if($row['fichierIncludé'] === $fichier) {
$entry['fichierParent'] = basename($row['fichierContenant']);
break;
}
}
if($entry['fichierParent']) {
foreach($tableau2 as $row) {
if($row['fichierIncludé'] === $entry['fichierParent']) {
$entry['grandParent'] = basename($row['fichierContenant']);
break;
}
}
}
if($entry['grandParent']) {
foreach($tableau2 as $row) {
if($row['fichierIncludé'] === $entry['grandParent']) {
$entry['ailleul'] = basename($row['fichierContenant']);
break;
}
}
}
}
// Dernière étape : Proposition de nouveau lien
foreach($tableau3 as &$entry) {
$base = $entry['ailleul'] ?: ($entry['grandParent'] ?: $entry['fichierParent']);
$lien = $entry['lien'];
if($base) {
$compteurBase = substr_count($base, '/');
$compteurLien = substr_count($lien, '/');
if($compteurBase === $compteurLien) {
$entry['proposition'] = './';
} elseif($compteurBase < $compteurLien) {
$diff = $compteurLien - $compteurBase;
$entry['proposition'] = str_repeat('../', $diff);
} else {
$entry['proposition'] = './';
}
} else {
$entry['proposition'] = '';
}
}
// Création du fichier Excel
$spreadsheet = new Spreadsheet();
// Onglet tableau1
$sheet1 = $spreadsheet->createSheet();
$sheet1->setTitle('tableau1');
$sheet1->fromArray(['Chemin Complet'], NULL, 'A1');
foreach($tableau1 as $i => $fichier) {
$sheet1->setCellValue('A' . ($i + 2), $fichier);
}
// Onglet tableau2
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('tableau2');
$sheet2->fromArray(['Fichier Contenant', 'Fichier Includé', 'N° Ligne'], NULL, 'A1');
foreach($tableau2 as $i => $row) {
$sheet2->fromArray(array_values($row), NULL, 'A' . ($i + 2));
}
// Onglet tableau3
$sheet3 = $spreadsheet->createSheet();
$sheet3->setTitle('tableau3');
$sheet3->fromArray([
'Chemin du fichier', 'Fichier contenant lien', 'Lien', 'N° Ligne', 'Parent', 'GrandParent', 'Ailleul', 'Proposition'
], NULL, 'A1');
foreach($tableau3 as $i => $row) {
$sheet3->fromArray([
$row['cheminDufichierComplet'],
$row['fichierContenantLeLien'],
$row['lien'],
$row['numeroLigne'],
$row['fichierParent'],
$row['grandParent'],
$row['ailleul'],
$row['proposition']
], NULL, 'A' . ($i + 2));
}
// Supprimer la première feuille vide
$spreadsheet->removeSheetByIndex(0);
// Ajuster les colonnes
foreach($spreadsheet->getAllSheets() as $sheet) {
foreach(range('A', $sheet->getHighestDataColumn()) as $col) {
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$sheet->freezePane('A2');
}
// Sauvegarde du fichier
$writer = new Xls($spreadsheet);
$writer->save('/datas/07Prod/wwwRoot/alpha.wbadm/admin/adminInclude/Outillage/analyseDesLiens.xls');
echo "Analyse terminée. Fichier généré : analyseDesLiens.xls\n";
?>