Je suis en train de faire un moteur de recherche interne sans BDD.
Le moteur fait ça recherche dans tous les dossiers et sous dossiers, avec un seul mot mis dans le formulaire.
Le mot est recherché sur le nom du fichier, l’extension, et dans la lecture du fichier.
Le moteur lis dans php, htm, txt, doc, xls.
Le problème est que les résultats de doc et xls ne s’affiche pas correctement, j’ai des caractères incompréhensibles a la lecture, style carré ou des ÿ etc…
Je souhaiterai pouvoir faire des recherches également dans les pdf.
Si vous avez une solution, je suis à votre écoute.
Cordialement.
Formulaire dans index.php
<form method="post" target="_blank" action="test/Search.php"><br>
<div align="center"></div>
<div align="center"><span class="Style14 Style416"> RECHERCHE SUR LE SITE</span><br>
<input type="hidden" value="<?php echo $mot2 ?>" name="action">
<input type="text" maxlength="50" size="14" name="mot" onChange="javascript:this.value=this.value.toLowerCase();">
<input style="font-family:Verdana; font-size:10px; color:#CC0000; background-color:#DDDDDD" type="submit" value="Go"><br></div>
</form>
Search.php (dans dossier test/)
<?php
//Nombre de résultats affichés par page
$maxipage="10";
//Dossiers à scanner
$dossier=array(
""=>"..",
);
//Scan des sous-dossiers (jusqu'a 10 sous-dossier) : on ou off
$scan_sousdos="on";
//Configuration des fichiers/dossiers à exclure de la recherche
$exclu=array(
"../test",
);
//Affichage de l'extension des fichiers : on ou off
$montre_ext="on";
//Url
$go2url="[dossier]/[fichier]";
?>
<title>Moteur de Recherche</title>
<?php
//On adapte les variables selon la version de PHP
$version_de_php=phpversion();
$version_de_php=str_replace(".","",$version_de_php);
if($version_de_php>=410){
$action = $_POST['action'];
$mot = $_POST['mot'];
$start = $_POST['start'];
$multi = $_POST['multi'];
}
// Liste des codes htmls spéciaux
$caractere_special=array(
"à"=>"à",
"á"=>"á",
"â"=>"â",
"ã"=>"ã",
"ä"=>"ä",
"å"=>"å",
"æ"=>"æ",
"ç"=>"ç",
"è"=>"è",
"é"=>"é",
"ê"=>"ê",
"ë"=>"ë",
"î"=>"î",
"ï"=>"ï",
"ô"=>"ô",
"ö"=>"ö",
"ù"=>"ù",
"ú"=>"ú",
"û"=>"û",
"ü"=>"ü",
"&"=>"&",
);
//Variables par défaut
if($maxmots==""){ $maxmots="20"; }
if($maxipage==""){ $maxipage="20"; }
if($start=="" || $start=="0" ){ $start="1"; }
$longueur_mot=strlen($mot);
$mot=trim($mot);
$mot=ereg_replace(" +", " ", $mot);
$mot2=htmlspecialchars($mot);
?>
<?php
// On vérifie la longueur de la recherche
if($longueur_mot<3){
echo("<span class=\"1\"><u>Attention</u>: Votre recherche doit comporter au moins trois caractères.</span><br><br>");
echo("<a href=\"javascript:window.close();\">Fermer la fenetre</a>");
exit(); }
// Résultats à 0
$compteresultats="0";
$zetotal="0";
//Scan des sous dossiers sur 10 niveaux si on l'a activé
//On vérifie les sous-dossiers à scanner uniquement ici
//Ensuite on les rajoute à la liste
//Comme ça après on n'aura plus qu'a faire un scan classique
//Sur tous les dossiers de la liste
if($scan_sousdos=="on"){
$encore1=array();
$encore2=array();
foreach($dossier as $nomdos=>$d){
//Sous-dossier 1
$fp=opendir("$d");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$d."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore1[]="$verif";
}}} closedir($fp);
unset($fp); unset($nomdos); }
//Sous-dossier 2
foreach($encore1 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore2[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore1=array(); }
//Sous-dossier 3
foreach($encore2 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore1[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore2=array(); }
//Sous-dossier 4
foreach($encore1 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore2[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore1=array(); }
//Sous-dossier 5
foreach($encore2 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore1[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore2=array(); }
//Sous-dossier 6
foreach($encore1 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore2[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore1=array(); }
//Sous-dossier 7
foreach($encore2 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore1[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore2=array(); }
//Sous-dossier 8
foreach($encore1 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore2[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos);
$encore1=array(); }
//Sous-dossier 9
foreach($encore2 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
$encore1[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos); }
//Sous-dossier 10
foreach($encore1 as $nom_du_soudos=>$le_soudos){
$fp=opendir("$le_soudos");
while($file = readdir($fp)){
if($file!='.' && $file!='..'){
$verif=$le_soudos."/".$file;
if(is_dir($verif) && !(in_array($verif, $dossier)) && !(in_array($verif, $exclu))){
$dossier[]="$verif";
}}} closedir($fp);
unset($fp,$nom_du_soudos,$le_soudos,$encore1,$encore2);
}}
//Passage en minuscules de la recherche
$mot=strtolower($mot);
//Maintenant on lance le scan classique sur les dossiers de la liste
//Les sous-dossiers ont été rajoutés au besoin par la fonction précédente
foreach($dossier as $nomdos=>$d){
//Ouverture fichier
$fp=opendir("$d");
while($file = readdir($fp)){
if($file=="." || $file==".." || is_dir($file)){ continue; }
//On ne scanne pas les fichiers exclus
if(in_array($file, $exclu)){ continue; }
//On récupère l'extension
$ext = ereg_replace('^.*[.]([^.]*)$', '\\1', $file);
//Sélection des extensions
//On ne scanne que ces types de fichiers
if(
$ext!="htm"
&& $ext!="html"
&& $ext!="htmls"
&& $ext!="php"
&& $ext!="php3"
&& $ext!="php4"
&& $ext!="php5"
&& $ext!="txt"
&& $ext!="doc"
&& $ext!="xls"
&& $ext!="pdf"
&& $ext!="zip"
&& $ext!="gif"
&& $ext!="jpg"
&& $ext!="png"){ continue; }
//Maintenant on est sûr de devoir scanner le fichier
//On peut éxécuter tous les traitements nécessaires
//Détermination du type de fichier
//On ne vérifiera que le nom des fichiers de type "img" (image)
//alors que les fichiers de type "normal" seront entièrement retraités
//car considérés comme contenant du texte lisible par le moteur.
if($ext=="htm" || $ext=="html" || $ext=="htmls" || $ext=="php" || $ext=="php3" || $ext=="php4" || $ext=="php5" || $ext=="txt" || $ext=="doc" || $ext=="xls" || $ext=="pdf"){
$filetype="normal"; } else { $filetype="img"; }
//Maintenant qu'on a déterminé la place de notre fichier entre les deux types
//On va appliquer des retraitements préliminaires sur les fichiers de type "normal" uniquement
if($filetype=="normal"){
//On ouvre le contenu du fichier
$recupere_le_fichier=fopen("$d/$file","r");
$tout=fread($recupere_le_fichier,500000);
fclose($recupere_le_fichier);
//Passage en minuscules
$tout=strtolower($tout);
// Suppression du code
//$tout=notag($tout);
//On vire le html et le php
$tout=strip_tags($tout,'<title></title><script></script><head></head><style></style>');
//On récupère le titre du fichier
//Ou alors on affiche le nom avec l'extension
//Puis on supprime le titre pour ne pas fausser les résultats
if(strpos($tout,"<title>") && strpos($tout,"</title>")){
$titre1=strstr($tout,'<title>');
$titre2=strstr($tout,'</title>');
$titre1=str_replace("$titre2","",$titre1);
$titre1=str_replace("<title>","",$titre1);
if($titre1==""){ $titre=$file; } else{ $titre=$titre1; }
}
else{
$titre=$file; }
$titre=strtolower($titre);
unset($titre1, $titre2);
$tout = preg_replace('`<title.*?/title>`', '', $tout);
//On effectue des remplacements pour pouvoir appliquer les regex :
//1- On remplace le saut de ligne par un espace
//3- Les (code html pour un espace) sont remplacés par des espaces
//4- Les doubles espaces sont remplacés par un simple espace
$tout = str_replace("\n"," ",$tout);
$tout = str_replace(" "," ",$tout);
$tout = str_replace(" "," ",$tout);
$tout = str_replace('<','<',$tout);
$tout = str_replace('>','>',$tout);
$tout = str_replace('"','"',$tout);
$tout = str_replace('&','&',$tout);
$tout = str_replace("@@","&#",$tout);
//On lance les regex
//1- On vire le code entre <head> et </head> qui contient en général tout les trucs qui ne nous intéressent pas ici (feuille de style, javascript...)
//2- On vire le javascript pour éviter les bugs au cas ou une partie nous aurait échappée
//3- On vire les attributs de style pour les mêmes raisons
$tout = preg_replace('`<head.*?/head>`', '', $tout);
$tout = preg_replace('`<script.*?/script>`', '', $tout);
$tout = preg_replace('`<style.*?/style>`', '', $tout);
//On remplace le code html des accents et autres caractères spéciaux par le terme correspondant
//pour le titre et le contenu
foreach($caractere_special as $caractere_code=>$caractere_traduction){
$tout = str_replace("$caractere_code","$caractere_traduction",$tout);
$titre = str_replace("$caractere_code","$caractere_traduction",$titre); }
}
//On incrémente le nb de fichiers scannés
$zetotal++;
if($zetotal>9999){ continue 2; }
//Si on trouve la recherche
//if(strpos("$tout","$mot") || strpos("$file","$mot") || strpos("$titre","$mot")){
if(strpos(strtolower($tout),strtolower($mot))>-1 || strpos(strtolower($file),strtolower($mot))>-1 || strpos(strtolower($titre),strtolower($mot))>-1){
//Résultats +1
$compteresultats++;
//S'il s'agit d'un fichier de type "normal"
if($filetype=="normal"){
//On compte les occurences du terme
$total_mots=intval(substr_count($titre,$mot)*10+$total_mots);
$total_mots=intval(substr_count($tout,$mot)+$total_mots);
//On crée la description
$position=strpos($tout, $mot);
$start_position=intval($position-50);
if($start_position<0){ $start_position="0"; }
$fin_position=intval($longueur_mot+100);
if($position === FALSE ){
$resume.=" Terme exact introuvable dans le contenu du fichier. (voir Ext.)"; }
else{
$resume=" ... ";
//$resume.=substr($tout, $start_position, $fin_position);
$resume.=substr($tout, $start_position, $fin_position);
$resume.=" ...";
//On met en gras le terme recherché dans la description
$resume=str_replace($mot,"<b>$mot2</b>",$resume); }
}
//Si c'est une image ou un autre type de fichier
//On adapte la description
else{ $resume=" Fichier $ext"; }
//Puis dans le titre
$titre=str_replace($mot,"<b>$mot2</b>",$titre);
//Calcul du pourcentage de pertinence
similar_text($mot, $tout, $p1);
similar_text($mot, $titre, $p2);
$p=intval($p1+$p2);
//Si le pourcentage est supérieur ou égal à 100 on le ramène à 99
//Et s'il est égal à 0 on le ramène à 1 pour qu'il puisse être réindexé (voir suite)
if($p>=100){ $p="99"; }
if($p=="0"){ $p="1"; }
if($total_mots>=100){ $total_mots="99"; }
if (strlen($total_mots)==1){
$total_mots=str_repeat("0",2-strlen($total_mots)).$total_mots; }
$total_mots=substr($total_mots, 0, 1);
//Idem pour les pourcentages
if (strlen($p)==1){
$p=str_repeat("0",2-strlen($p)).$p; }
//Et enfin le numéro du résultat
$compteresultats2=$compteresultats;
if (strlen($compteresultats2)<4){
$compteresultats2=str_repeat("0",4-strlen($compteresultats2)).$compteresultats2; }
//On met la première lettre du titre en majuscules
$titre=ucfirst($titre);
//On vire l'extension si besoin
if($montre_ext=="off" && $filetype!="img"){
$file=str_replace(".$ext","",$file); }
if($go2url==""){ $go_2_url="$d/$file"; }
else{
$go_2_url="$go2url";
$go_2_url=str_replace("[dossier]",$d,$go_2_url);
$go_2_url=str_replace("[fichier]",$file,$go_2_url); }
//Source du résultat
$src=" <A href=\"$go_2_url\" target=_blank><span class=\"2\">$titre</span></A> <br>
$resume <br>
<span class=\"4\"> $go_2_url</span><br>
";
//On enregistre
$zeresults["1".$total_mots."".$p."".$compteresultats2]="$src";
//On remet a zéro histoire d'éviter des doublons
unset(
$compteresultats2,
$tout,
$resume,
$src,
$titre,
$filetype,
$p,
$p1,
$p2,
$file,
$ext,
$total_mots,
$register
);
}}
//Fermeture
closedir($fp);
unset($tout,$filetype,$fp,$ext); }
//Si on a des résultats
//On les classe par ordre décroissant de pertinence
if($compteresultats>0){
krsort($zeresults);
array_unshift($zeresults,"rien"); }
//On définit les différentes variables qui serviront pour la barre de navigation
if($start=="1" && $compteresultats=="0" ){ $start="0"; }
$pourvoir=intval($start+$maxipage-1);
if($pourvoir>$compteresultats){ $pourvoir=$compteresultats; }
$finstart=intval($compteresultats-$maxipage+1);
$prevbarre=intval($start-$maxipage);
$nextbarre=intval($start+$maxipage);
$nb_barre="1";
$compte_affichage=$start;
//Changement du texte selon les résultats
//Entre singulier et pluriel
$rs=" résultat trouvé ";
$fich=" fichier";
if($compteresultats>1){ $rs=" résultats trouvés "; }
if($zetotal>1){ $fich=" fichiers"; }
//Maintenant on commence l'affichage
if($compteresultats=="0"){
echo("<span class=\"3\"><br>Aucun résultat trouvé sur <b>$mot2</b> dans nos données.<br> Essayez d'élargir votre recherche en y mettant moins de mots ou vérifiez son orthographe.</span><br><br>");
}
else {
echo ("<span class=\"3\">Vous venez d'effectuer une recherche sur : <b>$mot2</b></span><br><span class=\"3\"><b> $compteresultats $rs</b></span><br><br>");
}
//On sélectionne les éléments du tableau de résultat à afficher et on les lance
if($compteresultats>0){
foreach($zeresults as $key=>$value){
if($key>=$start && $key<$nextbarre){
echo("<b>$key</b> : $value<br>");
$compte_affichage++; }} }
echo("<a href=\"javascript:window.close();\">Fermer la fenetre</a>");
//Et si on a trop de résultats par rapport au nombre à afficher dans la page on met la barre de navigation
if($compteresultats>$maxipage){
echo("<p align=center><br>");
if($start!="1"){
echo("<A href=\"Search.php?mot=$mot&action=go&choix=$choix\"><< Début</A> <A href=\"Search.php?mot=$mot&action=go&start=$prevbarre&choix=$choix\">< Page précédente</A> ("); }
else{ echo("<< Début < Page précédente ("); }
for($barre=1;$barre<$compteresultats;){
$finbarre=intval($compteresultats-$barre);
echo(" <A href=\"Search.php?mot=$mot&action=go&start=$barre&choix=$choix\">$nb_barre</A> ");
$nb_barre++;
$barre=intval($barre+$maxipage); }
if($start<$finstart){ echo(") <A href=\"Search.php?mot=$mot&action=go&start=$nextbarre&choix=$choix\">Page suivante ></A> <A href=\"Search.php?mot=$mot&action=go&start=$finstart&choix=$choix\">Fin >></A>"); }
else{ echo(") Page suivante > Fin >>"); }
echo("</p>");
}
?>