Moteur de recherche PHP interne sans BDD

Résolu/Fermé
DDdu69 Messages postés 4 Date d'inscription vendredi 12 juillet 2013 Statut Membre Dernière intervention 23 décembre 2013 - Modifié par DDdu69 le 12/07/2013 à 08:59
 DDdu69 - 15 juil. 2013 à 08:52
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>



A voir également:

4 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
12 juil. 2013 à 11:34
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
DDdu69 Messages postés 4 Date d'inscription vendredi 12 juillet 2013 Statut Membre Dernière intervention 23 décembre 2013 2
12 juil. 2013 à 14:21
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
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
12 juil. 2013 à 16:33
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
0
DDdu69 Messages postés 4 Date d'inscription vendredi 12 juillet 2013 Statut Membre Dernière intervention 23 décembre 2013 2
Modifié par DDdu69 le 12/07/2013 à 12:43
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 ?
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
12 juil. 2013 à 13:53
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
0
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 ;)
0