Petit moteur de recherche |
Code PHP par tedheu |
| |
PHP - Petit moteur de recherche
Version 2.1 (11 février 2008):
Un script PHP pour mettre un petit moteur de recherche sur une partie d'un site hébergé.
Le fichier PHP doit être placé à la racine de l'arborescence qui sera concernée par la recherche.
La recherche s'effectue sur un mot clef (une chaîne de caractères), les types des fichiers cibles sont paramétrables, des répertoires peuvent être isolés de la recherche.
TT |
 Pour pouvoir le télécharger, connectez-vous ! ;)<? //------------------------------------------------------------------------------ // Page PHP, pour un petit moteur de recherche // Tedheu, 11 février 2008, version 2.1 // Ce fichier php doit être placé dans le répertoire racine de l'arborescence // de répertoires dans lesquels la recherche s'effectura // Ce petit moteur permet de retrouver et de visualiser (un lien est créé), // les fichiers (nom et emplacement) qui contiennent le mot-clef // (sans tenir compte de la casse des caractères). // les lignes où le mot-clef sont affichées en mode texte (par simplification // les codes sources sont affichés tel quel.) //------------------------------------------------------------------------------
// initialisation // extensions des fichiers dans lesquels la recherche s'effectura $Extens= array('txt','html','htm','php','php3'); // interdictions de chercher dans certains répertoires, définis par leur nom // (valable pour tout leur contenu, fichiers + sous-répertoires) $MasqDo= array('secret'); $luimeme= basename($_SERVER['PHP_SELF']); // traitement des variables passées en POST $rechlancee='non'; $requete=''; if (isset($_POST['cherche'])){ $rechlancee='oui'; if (isset($_POST['requete'])) $requete=$_POST['requete']; } // paramétrage de magic_quotes_gpc ( get_magic_quotes_gpc())? $magquote= 'on': $magquote= 'off'; if($magquote=='on') $requete=stripslashes($requete); ?>
<!-- Entete HTML --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Moteur de recherche</TITLE> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="description" CONTENT="page PHP pour petit moteur de recherche"> <META NAME="copyright" CONTENT="TTU"> <META NAME="author" CONTENT="tedheu"> <META NAME="robots" CONTENT="all">
<!-- Style --> <STYLE type=text/css> BODY,TD,A,P,.h {font-family: arial,sans-serif} .h {font-size: 20px} .q {color: #0000cc} </STYLE>
<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000cc bgColor=#ffffff topMargin=3 marginheight="3"> <!-- formulaire de saisie --> <FORM method="post"> <H1 style="color: blue; font: bold italic 26px verdana">Petit moteur de recherche</H1> <CENTER> <TABLE cellSpacing="0" cellPadding="0" border="0"> <TR> <TD align="middle"> <INPUT name="requete" maxLength="2048" size="55" value="<? echo htmlspecialchars($requete,ENT_QUOTES) ?>"></TD> <TD width="25%"> <INPUT type="submit" name="cherche" value="Recherche"></TD> </TR> </TABLE> </CENTER> </FORM> <SPAN style="color: #88f; font: normal 10px arial">Tedheu 2008 <I>(version 2.1)</I></SPAN><BR>
<? // Ouverture de la boucle de traitement, si recherche lancée et requete non vide if (($rechlancee=='oui') and (!$requete=='')){ // boucle principale de traitement // traitement de la requête $req_lower= strtolower($requete); $occurrence=0; ?>
<!-- affichage HTML "bandeau" --> <TABLE border="0" cellSpacing="0" cellPadding="0" width="100%" bgColor="#e5ecf9"> <TR><TD width="100%" colspan="2" bgcolor="#3366cc"><IMG height="1" width="1"></TD></TR> <TR> <TD width="40%" bgColor="#e5ecf9">recherche <B style="color:navy"><? echo htmlspecialchars($requete,ENT_QUOTES) ?></B> </TD> <TD Id="Icomm" align="right" bgColor="#e5ecf9"> </TD> </TR> </TABLE>
<? // initialisation du parcours des fichiers $niveau=0; $Noeud[0]='.'; $Liste[0]='*'; do { // lecture du contenu du dossier courant, niveau= $niveau // correspondant au noeud de nom $Noeud[$niveau] // résultat > dossiers dans $Doss (de 0 à $ndoss) et fichiers dans $Fich (de 0 à $nfich) $chemin=''; for ($i=0;$i<=$niveau;$i++){ $chemin=$chemin.$Noeud[$i].'/'; } $dp=opendir($chemin); $ndoss=-1; $nfich=-1; while (gettype($file=readdir($dp))!= @boolean){ // pas le fichier php lui même if ($chemin=='./' and $file==$luimeme) $file='?'; // masquage des répertoires interdits (et leurs sous-répertoires) if (in_array($file,$MasqDo))$file='?'; if ($file!='.' and $file!='..' and $file!='?'){ if (is_dir($chemin.'/'.$file))$Doss[++$ndoss]=$file; if (is_file($chemin.'/'.$file))$Fich[++$nfich]=$file; } } closedir($dp); // y a t-il un dossier qui n'a pas été exploré ? $new=''; for ($i=0;$i<=$ndoss;$i++){ if (!strstr($Liste[$niveau],'*'.$Doss[$i].'*')){ $new=$Doss[$i]; break; } } if ($new!=''){ // si oui on descend dans ce dossier $new $Liste[$niveau]=$Liste[$niveau].$new.'*'; $niveau++; $Noeud[$niveau]=$new; $Liste[$niveau]='*'; } else { // si non, on traite les fichiers puis on remonte // chemin du répertoire= $chemin, liste des fichiers= tableau $Fich[] if (!($nfich<0)){ for ($i=0;$i<=$nfich;$i++){ $nomfch=$Fich[$i]; // gestion des extensions $ext=''; $ok= strrpos($nomfch, '.'); // pas d'extension $ok = false // pas de nom comme .htaccess, $ok = 0 // attention si ok=0 même chose que ok=false pour un test if (!$ok) if ($ok>=0) $ext = strtolower(substr($nomfch, strrpos($nomfch, '.')+1)); (in_array($ext,$Extens))? $ook=1: $ook=0; $note=''; if (!is_readable($chemin.'/'.$nomfch)){ $ook=0; $note= $note.'un ou des fichiers n\'ont pu être lus'; } // le fichier a une extension permise if ($ook==1){ // lecture du fichier $Lignefch=file($chemin.'/'.$nomfch); $debut=true; // recherche d'une occurence de la requête, quelquesoit la casse, ligne par ligne for ($ilgn=0;$ilgn<count($Lignefch);$ilgn++){ $presence=0; $req0=$req_lower; // pour gérer les caractères accentués "html" $reqh=htmlentities($req_lower); if ($req0txt=substr(stristr($Lignefch[$ilgn],$req0),0,strlen($req0))) $presence=1; if ($reqh!=$req0){ if ($reqhtxt=substr(stristr($Lignefch[$ilgn],$reqh),0,strlen($reqh))) $presence=2; } if ($presence>0){ print "<DIV style=font-size:12px>\n"; if ($debut){ $debut=false; $chemaff=substr($chemin,2); print "<SPAN style=\"color:purple\">-------------</SPAN><BR>\n"; print "<A href=\"$chemin$nomfch\" target=\"_blank\">$chemaff$nomfch</A> \n"; print "(<I style=\"color:purple\">dossier:</I> $chemin \n"; print "<I style=\"color:purple\">fichiers:</I> $nomfch )<BR>\n"; } $texte=StripSlashes(htmlspecialchars($Lignefch[$ilgn])); if ($presence==1){ $req=StripSlashes(htmlspecialchars($req0txt)); $texte=str_replace($req,'<B style="color: navy; background-color: ff8">'.$req.'</B>',$texte); } if ($presence==2){ $req=StripSlashes(htmlspecialchars($reqhtxt)); $texte=str_replace($req,'<B style="color: navy; background-color: fef">'.$req.'</B>',$texte); } print "<SPAN style=\"color:green\">ligne $ilgn :</SPAN> $texte\n"; print "</DIV>\n"; $occurrence++; } } } } } // après traitement, on remonte au niveau supérieur $niveau--; } } while ($niveau>=0); ?>
<SCRIPT language="JavaScript"> Objs=document.getElementById('Icomm'); commentaire= '<small>occurrence de la chaine <span style=color:blue>" <? echo htmlspecialchars($requete,ENT_QUOTES) ?> "</span> = <? echo $occurrence ?></small>' Objs.innerHTML= commentaire; </SCRIPT>
<? if ($occurrence==0){ print "<BR><BR>\n"; print "<SPAN style=\"color:navy\"><I>Recherche infructueuse ... pas de résultat</I></SPAN><BR>\n"; } if ($note!=''){ print "<small><I>(Attention: $note )</I></small>"; } // } // fin de la boucle principale de traitement ?>
</BODY> </HTML> |
Proposé par tedheu le 13/07/2007 [vu 25880 fois]
 fdthierry 21/09/07 | Bonjour,
Est il possible d'exclure des extensions au scan ?
J'ai mis $ext="htm";
Je souhaite interdir la lecture des .php.
Merci d'avance,
Thierry |  fdthierry 21/09/07 | C'est bon, j'avais mal lu, sorry |  tedheu 22/09/07 | Ya pas quoi ! |  OH 06/11/07 | Bonjour,
Quelle est la licence de ton script ?
Olivier |  tedheu 07/11/07 | Réponse à OH:
Il n'y a pas de licence, c'est un script libre, c'est dans cette optique que je l'ai posté ici.
TT |  koda29 09/12/07 | Salut tedheu !!!!
Il est vraiment super cool ton code, méanmoins j'ai une question,
Je l'ai fait fonctionner sous php5, avaec mon application web, pas de problème !!! Mais quand j'ai voulu passer le bout de code sous PHP4 ... ... ou la la la la grosse erreur au niveau du boolean :
Notice: Use of undefined constant boolean - assumed 'boolean' in ...
Et je ne voudrais pas en lever les erreur que Esayphp me marque.
Comment pourrais-je faire pour résoudre le problème. (je ne m'y connais pas trop, mais d'après l'erreur, c'est pas le boolean qui serait mal initialisé ???)
|  tedheu 11/12/07 | Réponse à koda29:
Ce bout de code a besoin du paramètrage de configuration PHP suivant:
error_reporting = E_ALL & ~E_NOTICE
et
register_globals = On
C'est dans le fichier php.ini
par exemple sur easyPHP 1.8, ces paramètres sont par défaut à:
error_reporting = E_ALL
et
register_globals = Off
TT |  jlb59 26/12/07 | Bonjour à tous,
Je voulais mettre un moteur de recherche sur mon site tout neuf, et j'ai trouvé celui-ci.
Je l'ai trouvé par hasard et il m'a fait tilt.
Le problème est que je n'ai pas très bien compris son fonctionnement.
Par exemple :
* Comment et où puis-je mettre de mots clé ?
* Comment faire pour qu'il fonctionne correctement parce que je n'y arrive pas, ou alors j'ai oublié qq chose ?
* Comment faire pour l'intégrer à mon site et aller à la page où il y a le mot clé ?
Merci d'avance de m'aider !
Cordialement.
JeanJean
|  tedheu 28/12/07 | Réponse à jlb59:
Bonjour,
Ce code est une page entière en PHP, dont le fichier correspondant pourrait être nommé "moteur.php" par exemple. Ce fichier est à placer dans le répertoire le plus "bas" de l'arboressence de dossiers et sous-dossiers qui seront "explorés" par la recherche. Certains dossiers (sensibles ?) peuvent être écartés en renseignant le tableau " $MasqDo " dans les premières lignes du script PHP par les noms des répertoires "interdits" à la recherche.
Ce fichier, page PHP, contient un formulaire pour sasir le mot clef. Il n'y a pas d'intégration à faire à proprement parlé, mais aiguiller vers cette page par un lien ...
Si il y a encore des zones d'hombre, ne pas hésiter à poster une question.
Cordialement,
TT |  gb 28/12/07 | Bonjour,
ce code ne fonctionne pas chez moi.
Mon serveur web est sous Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.2 configured, j'ai rajouté "search.php" avec ton bout de code, à la racine de mes pages html.
Mais mes recherches ne me retournent rien du tout. |  jlb59 29/12/07 | J'ai essayé le moteur et c'est super... long à paramétrer mais super ! |  jpl98 01/01/08 | Superbe moteur très complet, bravo.
Souci chez moi:
La recherche sur pages html se fait dans le code source
-> les lettres accentuées ne sont pas gérées
Je vois cette solution simple:
enlever les lettres accentuées du terme recherché par:
$nom_recherche = strtr($nom_recherche_orig, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
Y a-t-il mieux? |  mono2004 06/02/08 | merci de m'aider j'ai pas bien compris, j'ai l'erreur suivante:
Forbidden
You don't have permission to access /mono/phpBB2/includes/<br /><b>Notice</b>: Undefined variable: PHP_SELF in <b>c:\program files\easyphp1-8\www\mono\phpbb2\includes\mon.php</b> on line <b>43</b><br /> on this server.
Apache/1.3.33 Server at 127.0.0.1 Port 80 |  mono2004 06/02/08 | merci de me réponds et deme donne tous les étapes exacte à faire en détail car c'est urgent pour moi et d'après les autre membre est un bon code et merci de m'aider |  EnWood 06/02/08 | Pour répondre à la question de mono2004, tu n'as pas les permission pour accèder au repertoire "/mono/phpBB2/includes/" il te faut mettre les droits à 755.
Pour l'erreur ligne 43, change "$PHP_SELF" en $_SERVER["PHP_SELF"], il est possible que ça fonctionne mieux.
Bon code  |  tedheu 11/02/08 | J'ai mis à jour le code de ce bout de code en y ajoutant des améliorations qui permettent de répondre aux soucis décrits dans les commentaires.
Par contre, concernant les permissions des fichiers sur serveur, je n'ai trouvé de réponse simple, j'avoue que ce n'est pas très clair pour moi (j'ai fait des essais sur ifrance où l'on peut modifier les permissions, sans résultat convaicant ... je pense que d'autres paramètres interviennent ??).
Je rappelle que ce petit moteur de recherche permet de chercher un bout de chaîne de caractère dans le texte d'un fichier, y compris dans le code source s'il s'agit d'une page html.
TT |  Deallyra 11/03/08 | Hm, sympathique ce code, mais serait-il possible d'y ajouter quelques lignes pour chercher parmi les titres d'images dans les dossiers ?
J'aimerais qu'on m'aiguille pour le faire, si vous pouviez m'aider ... ^^ Merci ^_^ |  tedheu 15/03/08 | Réponse à Deallyra:
Ce n'est l'objet de ce bout de code. Là il est question de chercher un terme, un mot clef, dans le contenu d'un fichier.
A l'origine, c'était pour faire des vérifications dans les pages HTML d'un site ...
Ce que tu voudrais correspond à une autre application, le moteur de "parcours en arbre de l'arborescence de fichiers peut être repris", mais il faut traiter les noms de fichiers plutôt que le contenu.
Je regarderai ce point pour donner un coup de pouce ...
Mon mail est mon pseudo, puis l'arobase, puis free point fr.
TT |  bustakev 18/03/08 | tedheu j'ai testé ton code mais pourrai tu m'expliké comment il faut l'installé pour mon site stp ??
|  tedheu 18/03/08 | A Bustakev:
Tu copies ce fichier PHP dans un répertoire, en lui donnant le nom que tu veux, "vroum.php" par exemple. Quand tu invoqueras ce fichier dans ton navigateur (http://www. ... ./vroum.php), ce script présentera un formulaire pour un mot clef pour une recherche dans les fichiers d'extensions permises (cf. ligne: $Extens= array('txt','html','htm','php','php3'); ). La recherche s'effectue dans le répertoire ET dans les sous-répertoires. Tu peux interdire la recherche dans des noms de sous-répertoires en renseigant la ligne de sript " $MasqDo= array('secret'); ".
TT
PS: je reçois mal, les renvois mail des commentaires, mon mél est mon pseudo suivi de l'arobase puis free point fr.
|  bustakev 19/03/08 | a ok ok dak
mais maintenant g un autre souci avec les script quand je fais la recherche ça marque
"Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 211 bytes) in /mnt/147/sdb/d/9/bss971/Sons/moteurderecherche.php on line 146"
|  tedheu 20/03/08 | A Buskarev:
Ok, je vois ...
Mon code ne teste pas la taille du fichier (pour y chercher l'occurence du mot clef) avant de le lire (ligne 146), il faudra que j'intègre ça pour une prochaine version. Les scripts PHP tourne dans un environnement mémoire limité (configuration PHP, paramètre "memory_limit"). la limite est de l'ordre de quelques dizaines de Mo, selon les hébergements.
Le script a dû tomber sur du gros !
TT |  bustakev 21/03/08 | a ok ok merci kan mm sinon je voulais svaoir si tu est capable de fair un moteur de recherche ki cherche sur un serveur free des son mp3 ,wma ou des format vidéo ???? stp
je sais que je demande beaucoup mais je cherche ça partout  |  issam2101 08/04/08 | bonjour es que ton moteur de recherche permet de chercher dans les fichier doc?= |  jpfev 06/06/08 | Bonjour,
ce moteur derecherche fonctionne-t-il avec wampserser?
Merci de votre réponse. |  tedheu 08/06/08 | A jpfev:
Je ne connais pas wampserver, j'utilise EasyPHP1.8 pour tester le script PHP en local. En "distant", je l'ai testé chez Free, online et ifrance. A part des soucis de paramètrages sur les droit sd'accès des répertoires et fichiers, je ne vois pas pourquoi ça ne marcherait pas sous wampserver.
TT |  Tiph 18/06/08 | Bonjour,
Votre code ma sauvé la vie!!
Cependant il me fait des recherches dans le code sources de mes pages...
Comment changer cela ??
Merci et bravo |  tedheu 19/06/08 | A Tiph:
Bonjour,
La recherche ce fait dans le fichier, ligne par ligne, sans traitement préalable. Ce script ne fait donc pas de distinction entre l'intérieur d'une balise et le texte encadré par des balises. Si les balises (ouverture et/ou fermeture) sont totalement incluses dans la ligne, on doit pouvoir "facilement" retrancher ces parties avant d'effectuer la recherche. Par contre si les balises s'étalent sur plusieurs lignes cela devient compliqué pour ce script, il faut traiter plusieurs lignes voir l'ensemble du fichier. Pour du fichier HTML, on peut faire l'hypothèse que les balises sont écrites sur une seule ligne (par de retour ligne à l'intérieur). Mais pour du JavaScript, CSS et PHP, c'est une autre histoire ...
TT
PS: je suis content d'avoir sauvé une vie ;-) |  toneeo 26/06/08 | super code...néanmoins, il fonctionne sur Firefox mais fonctionne-t-il sur IE ? |  tedheu 27/06/08 | A Toneeo:
Sur IE oui, (j'ai testé sur IE6 & platforme win-XP, en local avec easyPHP1.8 ou en hébergé ...)
TT |  toneeo 27/06/08 | Alors, là... comprends pas...
J'ai testé sur IE6 et IE7.
- Lorsque je saisis un mot qui ne se trouve pas dans le code source, cela marche...
- Lorsque je saisis un mot qui s'y trouve forcément, l'input se vide, et rien ne m'indique que la recherche n'a pas été fructueuse.
Peux-tu m'aiguiller sur le sujet ? Merci |  tedheu 30/06/08 | A Teneeo:
Je ne vois pas non plus !
Il me faudrait un exemple, tu peux me joindre à l'adresse indiquée dans le ps d'un commentaire plus au dans la liste au 18-03-08.
TT |  ms 13/07/08 | $MasqDo |  tedheu 14/07/08 | $MasqDo est un tableau contenant le ou les noms de répertoire où on ne veut pas que la recherche soit effectuée.
On peut ajouter plusieurs noms de répertoires, exemple:
$MasqDo= array('secret0','secret1').
(A utiliser, si c'est utile ...)
TT |  qplpmlp2 17/07/08 | Bonjour,
ce code ne fonctionne pas sur le serveur académique : linux + save-mode en php : - Warning: opendir(): SAFE MODE Restriction in effect. The script whose uid is 1339 is not allowed to access ./ owned by uid 0 in /home/www/ - .
J'ai tourné en rond depuis quelques heures sans trouver la moindre solution.
Mon serveur web est sous Apache/2.0.46 (RedHat)) PHP/4.3.2. A ma décharge, je débute en langage php mais suis très curieux et touche-à-tout, la preuve.
Le programme tourne, installé dans un dossier ./fichiers mais n'exécute les recherches que sur les titres des fichiers.
Je continue de chercher...
Merci et bravo pour votre script dont la lecture m'inspire et m'encourage à persévérer.
Cordialement |  tedheu 18/07/08 | Réponse à qplpmlp2:
Désolé, je ne suis pas bien placé en matière de serveur, ...
J'ai vérifié sur Free et online où le script fonctionne, ces deux hébergeurs ont une config en "safe-mode" (par phpinfo() ), et ça n'a pas l'air de poser de problème de droit d'accès sur les fichiers et répertoires !
TT |  nobile 19/07/08 | Merci pour votre réponse rapide. J'ai testé le programme sur un de site de mon hébergeur personnel, 1&1 pour ne pas le nommer, (safe_mode=off) et ça marche super.
Je vais attendre la fin des vacances scolaires pour interpeller les responsables des serveurs académiques. En attendant, j'ai bricolé un moteur qui utilise une bd.
Cordialement
Norbert |  jfe 15/08/08 | bonjour tedheu,
tout fonctionne bien (après avoir rajouté php après <? ) mais :
- en appuyant sur Entrée : Internet Explorer 6 retourne une fenêtre vide, FF est ok
- avec le bouton Submit : IE6 + FF sont ok.
j'ai consulté le web mais je n'arrive pas à faire fonctionner leurs propositions : fonction javascript, champ hidden.
peux-tu m'éclairer stp ?
merci par avance, |  tedheu 15/08/08 | A jfe:
Oui, en effet, ... je pense que c'est dû à la méthode "post", avec une méthode "get" cela devrait fonctionner avec la touche "entrée", je vais regarder de ce coté ...
A suivre ....
T² |  tedheu 16/08/08 | A jfe:
J'ai trouvé ... dans le script, je teste si on a cliqué sur le bouton "recherche" (soit le bouton submit), en cas d'utilisation de la touche "entrée", le bouton n'est pas validé !
Il faut modifier quelques lignes de la manière suivante:
.........
// traitement des variables passées en POST
$rechlancee='non'; $requete='';
//if (isset($_POST['cherche'])){
//$rechlancee='oui';
if (isset($_POST['requete'])) {$rechlancee='oui'; $requete=$_POST['requete'];}
//}
.........
on ne teste plus la validation du bouton 'recherche', la présence de la requête suffit ...
TT
|  ricky 29/08/08 | Bonjour,
en premier lieu merci pour ce code, c'est un super outil!!!
Par contre j'ai un petit probleme, le moteur fonctionne parfaitement sous firefox mais lorsque je passe sous IE6 (pour info je suis sur winxp sp2)la recherche s'effectue correctement, les resultat s'affiche mais lorsque la page fini de se charger j'ai la page "Serveur introuvable" qui s'affiche..!
Est ce que quelqu'un aurait une solution à me proposer???
Merci d'avance |  ricky 29/08/08 | Rebonjour,
ne faite attention a mon post ci dessus, j'avais fais quelques modifs dans le code et j'ai trouvé d'ou venais mon probleme.
Merci encore pour ce fameux code qui je dois l'avouer me rend bien service... |  ricky 29/08/08 | Bonjour,
je souhaiterais modifier le code de façon a chercher le mot clé uniquement sur les noms des documents et non pas sur leurs contenus...Malheureusement je suis novice en php et je ne sais pas comment faire.Est ce que quelqu'un aurait une idée...
Merci
PS:en fait mon probleme énoncé precedement n'est pas réglé mais comme la recherche se fait sur une dixaine de repertoires et sur plus de 1500 documents je pense que la recherche est trop longue ce qui doit faire planté le prog!Enfin je pense... |  tedheu 01/09/08 | Réponse à Ricky:
Voici une petite variante à tester:
remplacer les lignes de code
de
// le fichier a une extension permise
à
$occurrence++;
}
}
}
par ces nouvelles lignes:
// le fichier a une extension permise
if ($ook==1){
$presence=0;
$req0=$req_lower;
if ($req0txt=substr(stristr($nomfch,$req0),0,strlen($req0))) $presence=1;
if ($presence>0){
print "<DIV style=font-size:12px>\n";
$texte=StripSlashes(htmlspecialchars($nomfch));
$req=StripSlashes(htmlspecialchars($req0txt));
$texte=str_replace($req,'<B style="color: navy; background-color: ff8">'.$req.'</B>',$texte);
$chemaff=substr($chemin,2);
print "<SPAN style=\"color:purple\">-------------</SPAN><BR>\n";
print "<A href=\"$chemin$nomfch\" target=\"_blank\">$chemaff$texte</A> \n";
print "(<I style=\"color:purple\">dossier:</I> $chemin )<BR>\n";
$occurrence++;
}
}
Bonne journée,
TT |  ricky 01/09/08 | Merci pour la réponse mais j'avais reussi à me debrouiller.
Merci encore pour ton code!!! |  jfe2 02/09/08 | bonjour t2,
merci pour ton correctif sur "enter", çà fonction ok,
jfe |  tedheu 03/09/08 | Je ne reçois qu'une partie des commentaires dans ma boîte mél ... va savoir pourquoi ? Alors désolé si parfois je ne réponds pas.
Pour me joindre directement utiliser l'adresse formée de mon pseudo suivi du signe-arobace, et du nom de domaine "free point fr".
TT |  jfe2 29/09/08 | Bonjour à ceux qui rament,
2 petites remarques :
- remplacer <? par <?php (sinon wampserver raconte des histoires)
- pour rechercher à partir d'autres répertoires, paramétrer $Noeud[0],
par exemple : $Noeud[0]='.'; pour le répertoire courant, $Noeud[0]='..'; pour le répertoire amont, $Noeud[0]='../../toto/titi'; pour remonter de 2 rép puis redescendre par toto et titi (ainsi le script n'a pas besoin d'être placé exactement à la racine de l'arborescence de la recherche ).
Merci encore Tedheu, |  Michelas29 12/10/08 | Bien ce petit moteur, idéal pour un petit site et facile à mettre en place. Mais (y a un mais, bien sûr) les recherches se font sur la source, si on recherche un tag quelqu'il soit (head, font, < ou autres) toutes pages donnent un résultat positif.
N'y a t'il pas un moyen pour que les recherches ignorent les tags html et javascript? |  Michelas29 12/10/08 | Question subsidiare, puisque tu dis "La recherche ce fait dans le fichier, ligne par ligne,...", peux t'on limiter cette recherche à la seule première ligne du contenu fichiers ?sur mes fichiers eule cette première ligne contient du texte sur lequel faire la recherche) - si oui, comment faire?
Merci pour ta réponse. |  tedheu 17/10/08 | Réponse à Michelas29:
A la première question:
Oui la recherche s'effectue dans l'ensemble du "source", au départ, c'était un outil que j'avais fait pour vérifier le source (PB de mise à jour, changement de termes, ...). Le faire uniquement dans les parties 'texte', ne devrait pas poser trop de probléme pour du HTML "bien écrit", mais je suis pas sur que cela ne devienne pas compliqué avec des parties javascript, CSS ... et + avec du PHP.
A la seconde question:
On peut limiter la recherche à la première ligne de texte. la boucle va de
149 for ($ilgn=0;$ilgn<count($Lignefch);$ilgn++){
à
...
179 $occurrence++;
180 }
181 }
Il suffit de changer la ligne 149 du code par
$ilgn=0;
et détruire la ligne 181 (ou la commenter par " //} " )
TT |  sosouh 23/10/08 | Bonjour Tedheu,
Merci pour vos code mais je cherche une code pour lire l'enregistrement dans la base de donnée. Est-ce qu'il y en a ou non?
Merci d'avance |  dhas 30/10/08 | Super code! s'est encore mieux que se que je cherchais cependant je me rend compte que la liste des fichiers s'arrête à 9 alors que j'en ais bien plus que celà. Quelle est la solution pour en lire d'avantage?
|  tedheu 01/11/08 | Désolé ... mais je ne reçois les commentaires que de manière très irrégulière ?
Réponse à Sosouh:
Ce script ne travaille pas sur une base de donnée, mais directement sur les fichiers. A chaque recherche, il parcourt l'arboresence et fouille le contenu des fichiers, c'est pour cela que je l'ai qualifié de "simple" moteur de recherche.
Réponse à Dhas:
Alors là je ne vois pas pourquoi il se limite à 9 ! ... la raison est ailleurs.
Tedheu |  toneeox 17/02/09 | Salut et tout d'abord merci !
Ce code est magnifique. Néanmoins, j'ai une question.
Peut-on effectuer la recherche uniquement entre les balises "body" ? peut-on également exclure des mots comme <table><img>etc... ?
Merci d'avance et encore Bravo !!! |  tedheu 17/02/09 | Réponse à toneeox:
Voici une proposition (c'est un peu bricolé, mais ça a l'air de fonctionner) à tester ...
<?
//------------------------------------------------------------------------------
// Page PHP, pour un petit moteur de recherche
// Tedheu, 11 février 2008, version 2.1txt
// Ce fichier php doit être placé dans le répertoire racine de l'arborescence
// de répertoires dans lesquels la recherche s'effectura
// Ce petit moteur permet de retrouver et de visualiser (un lien est créé),
// les fichiers (nom et emplacement) qui contiennent le mot-clef
// (sans tenir compte de la casse des caractères).
// les lignes où le mot-clef sont affichées en mode texte (par simplification
// les codes sources sont affichés tel quel.)
//------------------------------------------------------------------------------
// initialisation
// extensions des fichiers dans lesquels la recherche s'effectura
$Extens= array('txt','html','htm');
// interdictions de chercher dans certains répertoires, définis par leur nom
// (valable pour tout leur contenu, fichiers + sous-répertoires)
$MasqDo= array('secret');
$luimeme= basename($_SERVER['PHP_SELF']);
// traitement des variables passées en POST
$rechlancee='non'; $requete='';
if (isset($_POST['requete'])){
$rechlancee='oui';
$requete=$_POST['requete'];
}
// paramétrage de magic_quotes_gpc
( get_magic_quotes_gpc())? $magquote= 'on': $magquote= 'off';
if($magquote=='on') $requete=stripslashes($requete);
?>
<!-- Entete HTML -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Moteur de recherche</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<META NAME="description" CONTENT="page PHP pour petit moteur de recherche">
<META NAME="copyright" CONTENT="TTU">
<META NAME="author" CONTENT="tedheu">
<META NAME="robots" CONTENT="all">
<!-- Style -->
<STYLE type=text/css>
BODY,TD,A,P,.h {font-family: arial,sans-serif}
.h {font-size: 20px}
.q {color: #0000cc}
</STYLE>
<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000cc bgColor=#ffffff topMargin=3 marginheight="3">
<!-- formulaire de saisie -->
<FORM method="post">
<I>Essais pour une recherche dans le texte hors balises HTML, 17 février 2009</I>
<H1 style="color: blue; font: bold italic 26px verdana">Petit moteur de recherche</H1>
<CENTER>
<TABLE cellSpacing="0" cellPadding="0" border="0">
<TR>
<TD align="middle">
<INPUT name="requete" maxLength="2048" size="55" value="<? echo htmlspecialchars($requete,ENT_QUOTES) ?>"></TD>
<TD width="25%">
<INPUT type="submit" name="cherche" value="Recherche"></TD>
</TR>
</TABLE>
</CENTER>
</FORM>
<SPAN style="color: #88f; font: normal 10px arial">Tedheu 2008 <I>(version 2.1txt)</I></SPAN><BR>
<?
// Ouverture de la boucle de traitement, si recherche lancée et requete non vide
if (($rechlancee=='oui') and (!$requete=='')){ // boucle principale de traitement
// traitement de la requête
$req_lower= strtolower($requete);
$occurrence=0;
?>
<!-- affichage HTML "bandeau" -->
<TABLE border="0" cellSpacing="0" cellPadding="0" width="100%" bgColor="#e5ecf9">
<TR><TD width="100%" colspan="2" bgcolor="#3366cc"><IMG height="1" width="1"></TD></TR>
<TR>
<TD width="40%" bgColor="#e5ecf9">recherche <B style="color:navy"><? echo htmlspecialchars($requete,ENT_QUOTES) ?></B> </TD>
<TD Id="Icomm" align="right" bgColor="#e5ecf9"> </TD>
</TR>
</TABLE>
<?
// initialisation du parcours des fichiers
$niveau=0;
$Noeud[0]='.';
$Liste[0]='*';
do {
// lecture du contenu du dossier courant, niveau= $niveau
// correspondant au noeud de nom $Noeud[$niveau]
// résultat > dossiers dans $Doss (de 0 à $ndoss) et fichiers dans $Fich (de 0 à $nfich)
$chemin='';
for ($i=0;$i<=$niveau;$i++){
$chemin=$chemin.$Noeud[$i].'/';
}
$dp=opendir($chemin); $ndoss=-1; $nfich=-1;
while (gettype($file=readdir($dp))!= @boolean){
// pas le fichier php lui même
if ($chemin=='./' and $file==$luimeme) $file='?';
// masquage des répertoires interdits (et leurs sous-répertoires)
if (in_array($file,$MasqDo))$file='?';
if ($file!='.' and $file!='..' and $file!='?'){
if (is_dir($chemin.'/'.$file))$Doss[++$ndoss]=$file;
if (is_file($chemin.'/'.$file))$Fich[++$nfich]=$file;
}
}
closedir($dp);
// y a t-il un dossier qui n'a pas été exploré ?
$new='';
for ($i=0;$i<=$ndoss;$i++){
if (!strstr($Liste[$niveau],'*'.$Doss[$i].'*')){
$new=$Doss[$i];
break;
}
}
if ($new!=''){
// si oui on descend dans ce dossier $new
$Liste[$niveau]=$Liste[$niveau].$new.'*';
$niveau++;
$Noeud[$niveau]=$new;
$Liste[$niveau]='*';
}
else {
// si non, on traite les fichiers puis on remonte
// chemin du répertoire= $chemin, liste des fichiers= tableau $Fich[]
if (!($nfich<0)){
for ($i=0;$i<=$nfich;$i++){
$nomfch=$Fich[$i];
// gestion des extensions
$ext='';
$ok= strrpos($nomfch, '.');
// pas d'extension $ok = false
// pas de nom comme .htaccess, $ok = 0
// attention si ok=0 même chose que ok=false pour un test if (!$ok)
if ($ok>=0) $ext = strtolower(substr($nomfch, strrpos($nomfch, '.')+1));
(in_array($ext,$Extens))? $ook=1: $ook=0;
$note='';
if (!is_readable($chemin.'/'.$nomfch)){
$ook=0;
$note= $note.'un ou des fichiers n\'ont pu être lus';
}
// le fichier a une extension permise
if ($ook==1){
// lecture du fichier
$Lignefch=file($chemin.'/'.$nomfch);
$debut=true;
// recherche d'une occurence de la requête, quelquesoit la casse, ligne par ligne
for ($ilgn=0;$ilgn<count($Lignefch);$ilgn++){
$presence=0;
$req0=$req_lower;
// pour gérer les caractères accentués "html"
$reqh=htmlentities($req_lower);
if ($req0txt=substr(stristr(strip_tags($Lignefch[$ilgn]),$req0),0,strlen($req0))) $presence=1;
if ($reqh!=$req0){
if ($reqhtxt=substr(stristr(strip_tags($Lignefch[$ilgn]),$reqh),0,strlen($reqh))) $presence=2;
}
if ($presence>0){
print "<DIV style=font-size:12px>\n";
if ($debut){
$debut=false;
$chemaff=substr($chemin,2);
print "<SPAN style=\"color:purple\">-------------</SPAN><BR>\n";
print "<A href=\"$chemin$nomfch\" target=\"_blank\">$chemaff$nomfch</A> \n";
print "(<I style=\"color:purple\">dossier:</I> $chemin \n";
print "<I style=\"color:purple\">fichiers:</I> $nomfch )<BR>\n";
}
$texte=StripSlashes($Lignefch[$ilgn]);
$texte=str_replace('<',chr(92).'<',$texte); $texte=str_replace('>','>'.chr(92),$texte);
$Bout2texte= explode(chr(92),$texte);
$texte= '';
foreach ($Bout2texte as $bout){
if (strip_tags($bout)!=''){
if ($presence==1){
$req=StripSlashes(htmlspecialchars($req0txt));
$texte.=str_replace($req,'<B style="color: navy; background-color: ff8">'.$req.'</B>',$bout);
}
if ($presence==2){
$req=StripSlashes(htmlspecialchars($reqhtxt));
$texte.=str_replace($req,'<B style="color: navy; background-color: fef">'.$req.'</B>',$bout);
}
}
else {
//
$texte.='<SPAN style="color: gray;">'.htmlspecialchars($bout).'</SPAN>';
}
}
print "<SPAN style=\"color:green\">ligne $ilgn :</SPAN> $texte\n";
print "</DIV>\n";
$occurrence++;
}
}
}
}
}
// après traitement, on remonte au niveau supérieur
$niveau--;
}
}
while ($niveau>=0);
?>
<SCRIPT language="JavaScript">
Objs=document.getElementById('Icomm');
commentaire= '<small>occurrence de la chaine <span style=color:blue>" <? echo htmlspecialchars($requete,ENT_QUOTES) ?> "</span> = <? echo $occurrence ?></small>'
Objs.innerHTML= commentaire;
</SCRIPT>
<?
if ($occurrence==0){
print "<BR><BR>\n";
print "<SPAN style=\"color:navy\"><I>Recherche infructueuse ... pas de résultat</I></SPAN><BR>\n";
}
if ($note!=''){
print "<small><I>(Attention: $note )</I></small>";
}
//
} // fin de la boucle principale de traitement
?>
</BODY>
</HTML>
TT |
|
Pour participer, il faut d'abord vous identifier !
| | 284 visiteurs ont déjà participé dont : | |
|
|