Moteur de recherche PHP interne sans BDD [Résolu/Fermé]

Signaler
Messages postés
4
Date d'inscription
vendredi 12 juillet 2013
Statut
Membre
Dernière intervention
23 décembre 2013
-
 DDdu69 -
Bonjour,

J'utilise le moteur de recherche interne ci-dessous dans mon site.
Il marche très bien pour toutes les pages de mon site mais lorsque je lance une recherche, il me liste non seulement les pages html, mais aussi toutes les pages css liées, les pages .js, les images etc...

J'aimerais donc exclure certaines extensions, ou lui dire de ne prendre que les pages html et php.

J'ai donc essayé d'intégrer à ce moteur une exclusion supplémentaire, à l'aide de la variable $exclurextension, mais rien à faire, les pages apparaissent toujours dans les résultats de la recherche.

Voici mon script :


<?php
// Tout début du code PHP. Situé en haut de la page web
ini_set("display_errors",0);error_reporting(0);
?>
  
<!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" xml:lang="fr" >
 <head>
  <title>Recherche</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design_recherche.css" />
 </head>
 <body>
<?php
/*------------------------------------------------------------*/
/*---------- Shooter's Search Engine v1.2 ----------*/
/*------------------------------------------------------------*/
  
/* Configuration */
// indique où le moteur de recherche doit rechercher
// './' correspond au dossier où se trouve la page
// '../' correspond au dossier contenant le dossier où se trouve la page
// '/' correspond au dossier de la racine de votre site web
$dossierDeLaRecherche = './';
  
// indique si le moteur de recherche doit rechercher DANS LE CODE SOURCE DES PAGES
// true pour rechercher dans le code source
// false pour ne pas rechercher dans le code source
$rechercherDansLeCodeSource = true;
  
// indique si le moteur de recherche doit rechercher DANS LES SOUS DOSSIERS
// true pour rechercher dans les sous dossiers
// false pour ne pas rechercher dans les sous dossiers (La recherche se limitera alors au dossier de la recherche)
define('RechercherDansLesSousDossiers', true);
  
// indique les pages que le moteur de recherche doit ignorer
// remplacez la ligne 33 par $exclure = array(); pour n'exclure aucune page
$exclure = array('recherche.php', 'resultats_recherche.php', 'design_recherche.css');
  
// indique les dossiers que le moteur de recherche doit ignorer
// remplacez la ligne 36 par $exclureDossier = array(); pour n'exclure aucun dossier
$exclureDossier = array();
  
//Ici j'essaye d'exclure les extensions non souhaitées
$exclurextensions = array("js","css","jpg","png");
  
function scanner($path)
{
 if($dir = opendir($path))
 {
  $fichiers = array();
  $i = 0;
  while(false !== ($file = readdir($dir)))
  {
   if($file != "." && $file != "..")
   {
    if(!is_dir($file))
    {
     $fichiers[$i] = preg_replace('#.#', '$0', $file);
     $i++;
    }
    else
    {
     if(RechercherDansLesSousDossiers)
     {
      $sous_dossier = scanner($file);
       
      $j = 0;
      while($j < count($sous_dossier))
      {
       array_unshift($fichiers, $file . '/' . preg_replace('#.#', '$0', $sous_dossier[$j]));
       $j++;
      }
      $i++;
     }
    }
   }
  }
  closedir($dir);
 }
 return $fichiers;
}
  
function exclureDossier($recherche, $arrayExclure)
{
 $recherche = explode('/', $recherche);
 $i = 0;
 while($i < count($recherche) - 1)
 {
  if(in_array($recherche[$i], $arrayExclure))
   return true;
  else
   return false;
  $i++;
 }
}
  
if(isset($_POST['recherche']) AND !empty($_POST['recherche']))
{
 $recherche = strip_tags($_POST['recherche']);
 $fichiers = scanner($dossierDeLaRecherche);
  
 /* chronomètre */
 $debut = microtime();
  
 /* si on a choisi tous les mots */
 if($_POST['mode'] == 'AND')
 {
  /* tableau contenant les fichiers qui contiennent la recherche */
  $resutats_recherche = array();
   
  /* on écrit la mise en forme */
  echo '<h1>Résultats de la recherche "<span class="italique">' . $recherche . '</span>" :</h1><hr /><p>';
   
  $i = 0;
  while($i < count($fichiers))
  {
   /* On ouvre le fichier */
   if($rechercherDansLeCodeSource)
    $fichier_courant = file_get_contents($fichiers[$i]);
   else
    $fichier_courant = strip_tags(file_get_contents($fichiers[$i]));
    
   $cherche = '#' . $recherche . '{1,}#is';
   if(preg_match($cherche, $fichier_courant))
   {
    //on affiche UNIQUEMENT les résultats conformes (qui ne sont pas dans les pages interdites)
    if(!exclureDossier($fichiers[$i], $exclureDossier) AND !in_array($fichiers[$i], $exclure) AND !in_array($fichiers[$i], $exclurextensions)) //C'est sur cette ligne là que j'essaye de rajouter ma variable d'exclusion des extensions
    {
     echo '<a href="' . $fichiers[$i] . '">' . $fichiers[$i] . '</a><br />';
     $resutats_recherche[$i] = $fichiers[$i];
    }
   }
   $i++;
  }
   
  /* Si il n'y a aucun résultat à afficher */
  if(count($resutats_recherche) == 0)
   echo 'La recherche n\'a retournée aucun résultat.';
  elseif(count($resutats_recherche) == 1)
   echo '</p><hr /><p>' . count($resutats_recherche) . ' page trouvée en ' . round(microtime() - $debut, 9) . ' secondes<br />';
  else
   echo '</p><hr /><p>' . count($resutats_recherche) . ' pages trouvées en ' . round(microtime() - $debut, 9) . ' secondes<br />';
 }
  
 /* si on a choisi au moins un mot */
 if($_POST['mode'] == 'OR')
 {
  /* tableau contenant les fichiers qui contiennent la recherche */
  $resutats_recherche = array();
   
  /* on écrit la mise en forme */
  echo '<h1>Résultats de la recherche "<span class="italique">' . $recherche . '</span>" :</h1><hr /><p>';
   
  $recherche = explode(' ', $recherche);
  $j = 0;
  $lien = array();
  while($j < count($recherche))
  {
   $lien[$j] = array();
   $i = 0;
   while($i < count($fichiers))
   {
    /* On ouvre le fichier */
    if($rechercherDansLeCodeSource)
     $fichier_courant = file_get_contents($fichiers[$i]);
    else
     $fichier_courant = strip_tags(file_get_contents($fichiers[$i]));
     
    $cherche = '#' . $recherche[$j] . '{1,}#is';
    if(preg_match($cherche, $fichier_courant))
    {
     //on affiche UNIQUEMENT les résultats conformes (qui ne sont pas dans les pages interdites)
     if(!exclureDossier($fichiers[$i], $exclureDossier) AND !in_array($fichiers[$i], $exclure) AND !in_array($fichiers[$i], $exclurextensions))//Ainsi que sur celle-ci
     {
      $lien[$j][$i] = '<a href="' . $fichiers[$i] . '">' . $fichiers[$i] . '</a><br />';
      $resutats_recherche[$i] = $fichiers[$i];
     }
    }
    $i++;
   }
   /* on affiche les résultats sous forme de catégories */
   if(!in_array($fichiers[$i], $exclure) AND !in_array($fichiers[$i], $exclurextensions)) //Et enfin celle-ci
   {
    echo '<span class="souligne">Résultats pour "<span class="italique">' . $recherche[$j] . '</span>" :</span><br />';
    foreach($lien[$j] as $sous_lien)
    {
     echo $sous_lien;
    }
   }
   $j++;
   /* Si il n'y a aucun résultat à afficher */
   if(count($resutats_recherche) == 0)
    echo 'La recherche n\'a retournée aucun résultat.<br/>';
  }
  if(count($resutats_recherche) == 0)
  {}
  elseif(count($resutats_recherche) == 1)
   echo '</p><hr /><p>' . count($resutats_recherche) . ' page trouvée en ' . round(microtime() - $debut, 9) . ' secondes<br />';
  else
   echo '</p><hr /><p>' . count($resutats_recherche) . ' pages trouvées en ' . round(microtime() - $debut, 9) . ' secondes<br />';
 }
}//fin du grand if
  
// Si on ne vient pas de la page de recherche, on y va !
else
{
 header('Status: 200 OK');
 header('Location: recherche.php');
}
?>
  </p>
 </body>
</html>



4 réponses

Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
983
Bonjour,

Pour commencer, je pense qu'il est plus pertinent de faire tes modifs dans la fonction « scanner », puisque c'est elle qui liste les fichiers qui seront, ensuite, lus.

Ton approche en créant un tableau des extensions à exclure est bonne, à mon avis.

Dans le code suivant :
    if(!is_dir($file))
    {
     $fichiers[$i] = preg_replace('#.#', '$0', $file);
     $i++;
    }

Rajoute la vérification de l'extension. Le code devient :
if(!is_dir($file))
{
    // On cherche l'extension $ext du fichier
    $temp_ext = explode('.', $file);
    $ext = $temp_ext[sizeof($temp_ext) - 1];

    // On n'ajoute le fichier à la liste que si son extension n'est pas dans le tableau $exclurextensions
    if (array_search(strtolower($ext), $exclurextensions) === FALSE)
    {
        $fichiers[$i] = preg_replace('#.#', '$0', $file);
        $i++;
    }
}


Xavier
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
4
Date d'inscription
vendredi 12 juillet 2013
Statut
Membre
Dernière intervention
23 décembre 2013
2
Merci ! Ca marche beaucoup mieux, maintenant je n'ai plus les extensions css ni jpg ni png, mais il me reste toujours les js.
J'ai essayé de mettre css en 1er dans l'array, et du coup je n'ai plus les js mais les css réapparaissent...
As-tu une idée ?
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
983
Oui :)

Dans la ligne
if (array_search(strtolower($ext), $exclurextensions) === FALSE)

J'avais bien mis trois signes = : ===, mais tu n'en as mis que 2 :)

Explication :
array_search renvoie l'index du tableau qui contient l'extension trouvée, ou renvoie FALSE si la recherche échoue.

Donc pour le premier élément du tableau, array_search renvoie 0.

Or, php n'est pas un langage fortement typé. Pour l'égalité classique ==, 0 et false sont pareils (de même que 1 et "1", 0 et "", etc.)
Pour avoir une égalité typée, il faut utiliser le triple égal === qui vérifie non seulement que la valeur est la même, mais également le type de donnée.

Xavier
Messages postés
4
Date d'inscription
vendredi 12 juillet 2013
Statut
Membre
Dernière intervention
23 décembre 2013
2
Bonjour Reivax962 et merci de ta réponse ;)
Cependant j'ai essayé avec ce code et les extensions exclues apparaissent toujours :
function scanner($path)
{
 if($dir = opendir($path))
 {
  $fichiers = array();
  $i = 0;
  while(false !== ($file = readdir($dir)))
  {
   if($file != "." && $file != "..")
   {
    if(!is_dir($file))
    {
     // On cherche l'extension $ext du fichier
     $temp_ext = explode('.', $file);
     $ext = $temp_ext[sizeof($temp_ext) - 1];
     // On n'ajoute le fichier à la liste que si son extension n'est pas dans le tableau $exclurextensions
     
     if (array_search(strtolower($ext), $exclurextensions) == FALSE)
     {
      $fichiers[$i] = preg_replace('#.#', '$0', $file);
      $i++;
     }
    }
    else
    {
     if(RechercherDansLesSousDossiers)
     {
      $sous_dossier = scanner($file);
      
      $j = 0;
      while($j < count($sous_dossier))
      {
       array_unshift($fichiers, $file . '/' . preg_replace('#.#', '$0', $sous_dossier[$j]));
       $j++;
      }
      $i++;
     }
    }
   }
  }
  closedir($dir);
  
 }
 return $fichiers;
}

Y aurait-il quelque chose d'autre à modifier ou est-ce que j'ai mal copié quelque chose ?
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
983
Ah, oui, au temps pour moi !

Le tableau $exclurextension n'est pas visible depuis la fonction scanner();...

Il faut donc rajouter
global $exclurextension;
au début de cette fonctions :
//Ici j'essaye d'exclure les extensions non souhaitées
$exclurextensions = array("js","css","jpg","png");
  
function scanner($path)
{
 global $exclurextensions;
 if($dir = opendir($path))



Xavier
Effectivement, ne connaissant pas cette règle pour les 3 "=", j'ai cru à une erreur de frappe :p
Merci beaucoup Reivax en tous cas !
Le sujet est résolu ;)