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

269 lines
9.8 KiB
PHP
Executable File

<?php
$nomFicAppelant = basename(__FILE__);
require_once '/datas/07Prod/include/vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xls;
class LinkAnalyzer {
private $rootPath = '/datas/07Prod/wwwRoot/alpha.wbadm/';
private $excludeDir = 'Outillage';
private $tableau1 = [];
private $tableau2 = [];
private $tableau3 = [];
public function runAnalysis() {
// Étape 1: Scanner les fichiers PHP
$this->scanPhpFiles();
// Étape 2: Analyser includes et $src
$this->analyzeIncludesAndSrc();
// Étape 3: Analyser les liens href et JavaScript
$this->analyzeLinks();
// Étape 4: Trouver parents, grands-parents et aïeuls
$this->findParentRelationships();
// Étape 5: Générer propositions de liens
$this->generateLinkPropositions();
// Générer fichier Excel
$this->generateExcel();
}
private function scanPhpFiles() {
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($this->rootPath, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
if ($file->isFile() && $file->getExtension() === 'php') {
$filePath = $file->getPathname();
$fileName = $file->getFilename();
$relativePath = str_replace($this->rootPath, './', $filePath);
// Exclure gallerie.php et le dossier Outillage
if ($fileName !== 'gallerie.php' && strpos($filePath, $this->excludeDir) === false) {
$this->tableau1[] = [
'cheminComplet' => $relativePath
];
}
}
}
}
private function analyzeIncludesAndSrc() {
foreach ($this->tableau1 as $file) {
$filePath = $this->rootPath . substr($file['cheminComplet'], 2);
if (!is_readable($filePath)) {
continue;
}
$lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$relativePath = str_replace($this->rootPath, './', $filePath);
foreach ($lines as $lineNumber => $line) {
// Recherche des includes
if (preg_match('/include\s*[\'"]?([^\'"]+\.php)[\'"]?/i', $line, $matches)) {
$includedFile = basename($matches[1]);
$this->tableau2[] = [
'fichierContenant' => $relativePath,
'fichierIncludé' => $includedFile,
'numeroLigne' => $lineNumber + 1
];
}
// Recherche des $src=
if (preg_match('/\$src\s*=\s*[\'"]?([^\'"]+\.php)[\'"]?/i', $line, $matches)) {
$srcFile = basename($matches[1]);
$this->tableau2[] = [
'fichierContenant' => $relativePath,
'fichierIncludé' => $srcFile,
'numeroLigne' => $lineNumber + 1
];
}
}
}
}
private function analyzeLinks() {
foreach ($this->tableau1 as $file) {
$filePath = $this->rootPath . substr($file['cheminComplet'], 2);
if (!is_readable($filePath)) {
continue;
}
$lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$relativePath = str_replace($this->rootPath, './', $filePath);
$fileName = basename($filePath);
foreach ($lines as $lineNumber => $line) {
// Recherche des href
if (preg_match('/href\s*=\s*[\'"]([^\'"]+)[\'"]/i', $line, $matches)) {
$link = trim($matches[1]);
if ($this->isValidLink($link)) {
$this->tableau3[] = [
'cheminDufichierComplet' => $relativePath,
'fichierContenantLeLien' => $fileName,
'Lien' => $link,
'N°Ligne' => $lineNumber + 1,
'fichierParent' => '',
'grandParent' => '',
'ailleul' => '',
'proposition' => ''
];
}
}
// Recherche des location JavaScript
if (preg_match('/(?:document|top|self|parent)\.location\.(?:href\s*=\s*[\'"]([^\'"]+)[\'"])/i', $line, $matches)) {
$link = trim($matches[1]);
if ($this->isValidLink($link)) {
$this->tableau3[] = [
'cheminDufichierComplet' => $relativePath,
'fichierContenantLeLien' => $fileName,
'Lien' => $link,
'N°Ligne' => $lineNumber + 1,
'fichierParent' => '',
'grandParent' => '',
'ailleul' => '',
'proposition' => ''
];
}
}
}
}
}
private function isValidLink($link) {
return !empty($link) &&
!preg_match('/^(http|#|mailto|tel)/i', $link);
}
private function findParentRelationships() {
// Première passe: trouver fichierParent
foreach ($this->tableau3 as &$row) {
$fileToFind = $row['fichierContenantLeLien'];
foreach ($this->tableau2 as $include) {
if ($fileToFind === $include['fichierIncludé']) {
$row['fichierParent'] = $include['fichierContenant'];
break;
}
}
}
// Deuxième passe: trouver grandParent
$updated = true;
while ($updated) {
$updated = false;
foreach ($this->tableau3 as &$row) {
if (!empty($row['fichierParent']) && empty($row['grandParent'])) {
$fileToFind = basename($row['fichierParent']);
foreach ($this->tableau2 as $include) {
if ($fileToFind === $include['fichierIncludé']) {
$row['grandParent'] = $include['fichierContenant'];
$updated = true;
break;
}
}
}
}
}
// Troisième passe: trouver ailleul
$updated = true;
while ($updated) {
$updated = false;
foreach ($this->tableau3 as &$row) {
if (!empty($row['grandParent']) && empty($row['ailleul'])) {
$fileToFind = basename($row['grandParent']);
foreach ($this->tableau2 as $include) {
if ($fileToFind === $include['fichierIncludé']) {
$row['ailleul'] = $include['fichierContenant'];
$updated = true;
break;
}
}
}
}
}
}
private function generateLinkPropositions() {
foreach ($this->tableau3 as &$row) {
$referencePath = !empty($row['ailleul']) ? $row['ailleul'] :
(!empty($row['grandParent']) ? $row['grandParent'] :
(!empty($row['fichierParent']) ? $row['fichierParent'] : ''));
if (empty($referencePath)) {
continue;
}
$link = $row['Lien'];
$linkSlashCount = substr_count($link, '/');
$refSlashCount = substr_count($referencePath, '/');
if ($linkSlashCount === $refSlashCount) {
$row['proposition'] = './';
} else {
$diff = $linkSlashCount - $refSlashCount;
$prefix = $diff > 0 ? str_repeat('../', $diff) : './';
$row['proposition'] = $prefix . ltrim($link, '/');
}
}
}
private function generateExcel() {
$spreadsheet = new Spreadsheet();
// Tableau 1
$sheet1 = $spreadsheet->getActiveSheet();
$sheet1->setTitle('Tableau 1');
$sheet1->fromArray(['Chemin Complet'], null, 'A1');
$sheet1->fromArray($this->tableau1, null, 'A2');
$sheet1->freezePane('A2');
$sheet1->getColumnDimension('A')->setAutoSize(true);
// Tableau 2
$sheet2 = $spreadsheet->createSheet();
$sheet2->setTitle('Tableau 2');
$sheet2->fromArray(['Fichier Contenant', 'Fichier Includé', 'N° Ligne'], null, 'A1');
$sheet2->fromArray($this->tableau2, null, 'A2');
$sheet2->freezePane('A2');
foreach (range('A', 'C') as $col) {
$sheet2->getColumnDimension($col)->setAutoSize(true);
}
// Tableau 3
$sheet3 = $spreadsheet->createSheet();
$sheet3->setTitle('Tableau 3');
$headers = [
'Chemin Du Fichier Complet',
'Fichier Contenant Le Lien',
'Lien',
'N° Ligne',
'Fichier Parent',
'Grand Parent',
'Ailleul',
'Proposition'
];
$sheet3->fromArray($headers, null, 'A1');
$sheet3->fromArray($this->tableau3, null, 'A2');
$sheet3->freezePane('A2');
foreach (range('A', 'H') as $col) {
$sheet3->getColumnDimension($col)->setAutoSize(true);
}
$writer = new Xls($spreadsheet);
$writer->save('analyseDesLiensGrok.xls');
}
}
try {
$analyzer = new LinkAnalyzer();
$analyzer->runAnalysis();
} catch (Exception $e) {
echo "Erreur: " . $e->getMessage();
}
?>