86 en ligne Comparateur | Sites | Forum | PhpBB | Actu | Glossaire | Codes | Tips | Liens | Livres | Lettre  

 Recherche

 Newsletter





 

Petit moteur de recherche

Code PHP par tedheu



  <Accueil>  Déjà 695 codes ! 
AJAX [5]AS 2.0 [1]ASP [111]ASP.NET [34]CSharp [11]CSS [14]
D [1]Delphi [5]DHTML [3]Divers [5]HTML [16]JavaScript [154]
JSP [9]Maths [1]PHP [255]PHP5 [18]PowerShell [22]Regex [4]
SQL [2]V.Basic [4]VBScript [13]VS.NET [5]WPF [1]XML [1]



tedheuPHP - 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%">&nbsp;
    <INPUT type="submit" name="cherche" value="Recherche"></TD>
  </TR>
 </TABLE>
 </CENTER>
</FORM>
<SPAN style="color: #88f; font: normal 10px arial">Tedheu&nbsp;2008&nbsp;&nbsp;<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&nbsp;<B style="color:navy"><? echo htmlspecialchars($requete,ENT_QUOTES) ?></B>&nbsp;</TD>
   <TD Id="Icomm" align="right" bgColor="#e5ecf9">&nbsp;</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> &nbsp;&nbsp;\n";
                  print "(<I style=\"color:purple\">dossier:</I> $chemin &nbsp;\n";
                  print "<I style=\"color:purple\">fichiers:</I>&nbsp;$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&nbsp;<span style=color:blue>&quot;&nbsp;<? echo htmlspecialchars($requete,ENT_QUOTES) ?>&nbsp;&quot;</span> =&nbsp;&nbsp;<? 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&eacute;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]
Commentaires
fdthierry
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
fdthierry
21/09/07

C'est bon, j'avais mal lu, sorry
tedheu
tedheu
22/09/07

Ya pas quoi !
OH
OH
06/11/07

Bonjour,

Quelle est la licence de ton script ?

Olivier
tedheu
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
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
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
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
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
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
jlb59
29/12/07

J'ai essayé le moteur et c'est super... long à paramétrer mais super !
jpl98
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
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
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
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
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
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
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
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
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
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
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
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
issam2101
08/04/08

bonjour es que ton moteur de recherche permet de chercher dans les fichier doc?=
jpfev
jpfev
06/06/08

Bonjour,
ce moteur derecherche fonctionne-t-il avec wampserser?
Merci de votre réponse.
tedheu
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
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
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
toneeo
26/06/08

super code...néanmoins, il fonctionne sur Firefox mais fonctionne-t-il sur IE ?
tedheu
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
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
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
ms
13/07/08

$MasqDo
tedheu
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
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
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
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
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
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 ....
tedheu
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
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
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
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
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> &nbsp;&nbsp;\n";
            print "(<I style=\"color:purple\">dossier:</I> $chemin &nbsp;)<BR>\n";
            $occurrence++;
          }
        }


Bonne journée,
TT
ricky
ricky
01/09/08

Merci pour la réponse mais j'avais reussi à me debrouiller.
Merci encore pour ton code!!!
jfe2
jfe2
02/09/08

bonjour t2,
merci pour ton correctif sur "enter", çà fonction ok,
jfe
tedheu
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
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
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
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
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
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
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
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
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
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%">&nbsp;
    <INPUT type="submit" name="cherche" value="Recherche"></TD>
  </TR>
 </TABLE>
 </CENTER>
</FORM>
<SPAN style="color: #88f; font: normal 10px arial">Tedheu&nbsp;2008&nbsp;&nbsp;<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&nbsp;<B style="color:navy"><? echo htmlspecialchars($requete,ENT_QUOTES) ?></B>&nbsp;</TD>
   <TD Id="Icomm" align="right" bgColor="#e5ecf9">&nbsp;</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> &nbsp;&nbsp;\n";
                  print "(<I style=\"color:purple\">dossier:</I> $chemin &nbsp;\n";
                  print "<I style=\"color:purple\">fichiers:</I>&nbsp;$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&nbsp;<span style=color:blue>&quot;&nbsp;<? echo htmlspecialchars($requete,ENT_QUOTES) ?>&nbsp;&quot;</span> =&nbsp;&nbsp;<? 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&eacute;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 :
DB77 [47]fmarie [26]Fabrice69 [25]CedX [25]Didier [22]
Bisou [20]tedheu [20]mohman [17]jreaux62 [16]romuluslepunk [15]
foxmaster [15]Vonscott [12]iubito [10]Redo [9]Balin [8]
poppy [7]fmaunier [6]cyrillus [6]pseudomenace [6]david96 [6]
CrazyCat [5]antoun [5]Pozzy [5]TBliss [5]Aurelien [5]
daoudi [5]Ours [5]bahdot [5]houcem_tsp [4]Chrigou [4]
debackp [4]lex [4]hyoucef [4]Jips [4]zut69 [3]
salem [3]berguerand01 [3]phenixbd [3]twins20 [3]kandal [3]
mhaido [3]mcorgnet [3]philouonline [3]master-killer [3]Maclearner [3]
crocxx [3]laetyboop [3]Poucet [3]olivierland94 [3]

Didier Téléchargez gratuitement et légalement des logiciels Microsoft ! Si, si ;)
  • Visual Studio 2010
  • Office 2010
  • Expression Studio 3
  • SQL Server 2008
  • et d'autres...

Au fil des news  
Magazines - Le N°132 de Programmez est disponible
Les alertes dans SharePoint 2007 - Comment SharePoint 2007 gère les User Alerts
Une des fonctionnalités de base de SharePoint, aussi bien dans Windows SharePoint Services (WSS) ...
Adobe - Photoshop.com Mobile pour Android 1.2
Adobe - Adobe dévoile une technologie de lecture.......
PHP - Experts PHP : participez au Forum PHP 2010 !
PHP - Fobec.com - Code source PHP & javascript
Foliotage alphabétique - Lister sur la première lettre d'un champ
Pour faire suite à l'article de JPierre sur la pagination alphabétique, voici, en ASP et en PHP, ...
Dreamweaver CS4 + Php + Mysql - Pagination alphabétique
Je vous propose la création d'une barre de navigation ou pagination alphabétique pour filtrer les ...
Adobe - HTML5 dans Dreamweaver CS5
VBScript - Déterminer si un chemin est absolu ou relatif
VBScript - Lire/écrire un fichier texte
Magazines - Le N°130 de Programmez est disponible
Hebergement - Hébergement à prix libre
Adobe - Adobe Creative Suite 5
PHP - Calcul de la date de Pâques
Magazines - Le N°128 de Programmez est disponible
Magazines - Le N°127 de Programmez est disponible
Dreamweaver CS4 + Php + Mysql - Trucs et Astuces - Part 6
Pour continuer dans le même style, je vous propose une suite au précédent article. Rechercher tous ...
Adobe - Adobe Photoshop.com Mobile pour iPhone 1.1
JavaScript - Ajouter une page dans vos favorites
Dreamweaver CS4 + Php + Mysql - Trucs et Astuces - Part 5 -
Je vous propose cette fois deux astuces. Comment exporter une feuille de style avec l'aide de ...
SharePoint Personalization Site Links - Les liens personnalisés des MySite SharePoint
Nous avons vu dans les articles précédents comment agrémenter les pages de recherche afin de ...
Magazines - Le n°126 de Programmez est disponible
Outils - Traducteur en ligne automatique pour site web
Adobe - Adobe Photoshop.com Mobile pour Iphone
Magazines - Le n°125 de Programmez est disponible
Adobe - Adobe AIR 2 et Flash Player 10.1version bêta
Les conférences autour des technologies Microsoft - Liste non exhaustive des grands évènements
Nous allons essayer de regrouper un grand nombre des évènements autour des technologies Microsoft ...
Magazines - Le n°124 de Programmez est disponible
PHP - Forum PHP 2009
Composants - eFace - XAML en Java
WPF - Désactiver le bouton de réduction d'une fenêtre
Magazines - Le n°123 de Programmez est disponible
Magazines - Le n°122 de Programmez est disponible
Auditer une ferme SharePoint - Assurer le bon fonctionnement de SharePoint
Dans le cadre de la bonne gestion de son environnement SharePoint, il est utile de faire un ...
SQL Server 2008 Report Builder 2.0 - Installation et utilisation de Report Builder 2.0
Dans le cadre de la création de rapports pour SQL Server Reporting Services 2008, un outil est ...
Magazines - Le HS N° 1 de Web Design est disponible
Adobe - Adobe propose en Open Source les frameworks.....
Outils - EntityBuilder
CSharp - Sérialisation XML de vos objets
  Tutorial : HTML | Scripting | ASP-PHP | ASP.net | SQL Server | XML
Sharepoint | XAML | Pocket | Dreamweaver | VML | Divers
  Scripts : Scripting | ASP-PHP | ASP.net | Divers
  Boutique | Annuaire | Bannières | Météo | Tribune | Partenariats | Recherches
v4.3 © Didier YVER
2001-2010
 
 

Corpo Sciences de Reims Partitions gratuites Carte, météo, annonces
TechNet Groupes Utilisateurs Microsoft ASP-magazine MVP DotNet Project