<?php

// ------------------------------------------------------------------------- //
// Moteur de recherche REGEX MySQL                                           //
// ------------------------------------------------------------------------- //
// Auteur: Sam0o7 <sam007@free.fr>                                           //
// Web:    http://therysam.free.fr/                                          //
// ------------------------------------------------------------------------- //

/*
Un petit moteur que j'ai réalisé pour une recherche de noms de domaines.
Les noms de domaines sont stockés dans une table MySQL avec 3 champs :
- id,
- dns, -
designation
Intérêt du script : Les REGEX avec MySQL
Utilisation : appeler le script en lui passant les parametres dans l'url :
    mc => mot(s) clé(s)
    l  => nombre de résultats maximum a trouver (à afficher)
    c  => 1 -> recherche 'et'
          2 -> recherche 'ou' (+ lent)
*/

If($l < 1)
{
$limite = 5;
}
Else
{
$limite = $l;
}

If(
$c == 2)
{
$clause = "OR";
$clausefr = "ou";
}
Else
{
$clause = "AND";
$clausefr = "et";
}

$mc = stripslashes(rawurldecode($mc));
// Nettoyage des caractères non-alphanumériques
$mots = eregi_replace("[^a-z0-9]", " ", $mc);

// Nettoyage des caractères spéciaux
$mots = strtr( strtolower($mots),
               
"àáâãäåòóôõöøèéêëçìíîïùúûüÿñ",
               
"aaaaaaooooooeeeeciiiiuuuuyn" );

// Récupération des mots clés dans une table mot[]
$mot = split(" +",$mots);

// Recherches dans la table des .fr pour chaque mot
ForEach($mot As $m)
{
// mots au début ou fin ou séparé par un signe -,_ ou .
$regexp  = '(^|(.+[-|_|.]))'.$m.'(([-|_|.].+)|$)';

// mots au début ou fin ou séparé par 2 espaces
  
$regexp2 = '(^|.+ )'.$m.'( .+|$)';

// Recherche dans le dns ET la description (mots evidents)
$where1 .= "(dns REGEXP '$regexp' AND designation REGEXP '$regexp2') $clause ";
// Recherche dans le dns (mots confondus)
$where2 .= "(dns LIKE '%$m%' AND NOT (dns REGEXP '$regexp' AND designation ".
            
"REGEXP '$regexp2')) $clause ";
// Recherche dans la description (mots évidents)
$where3 .= "(designation LIKE '%$m%' AND NOT (dns LIKE '%$m%' OR ".
            
"dns REGEXP '$regexp' AND designation REGEXP '$regexp2')) $clause ";

}

// Compléments pour fermer les requètes
If($clause == "AND")
{
$where1 .= "1=1";
$where2 .= "1=1";
$where3 .= "1=1";
}
Else
{
$where1 .= "1=0";
$where2 .= "1=0";
$where3 .= "1=0";
}

$requete = "SELECT dns,designation
            FROM stock_dnsfr
            WHERE $where1
            LIMIT 0,$limite"
;
$results = mysql_query($requete,$connexion);
$nb_results = mysql_num_rows($results);
$nombreTrouves += $nb_results;
If(
$nb_results>0)
{
While(
$row = mysql_fetch_row($results))
{
  
$dns = $row[0];
  
$designation = $row[1];
  
$resultat .= "<b>$dns</b><br>\n&nbsp;&nbsp;&nbsp;$designation<br><br>\n\n";
}
}
$resultat .= "<hr>";
If(
$nombreTrouves < $limite)
{
$requete = "SELECT dns,designation
             FROM stock_dnsfr
             WHERE $where2
             LIMIT 0,"
.($limite-$nombreTrouves);
$results = mysql_query($requete,$connexion);
$nb_results = mysql_num_rows($results);
$nombreTrouves += $nb_results;
If(
$nb_results>0)
{
  While(
$row = mysql_fetch_row($results))
  {
   
$dns = $row[0];
   
$designation = $row[1];
   
$resultat .= "<b>$dns</b><br>\n&nbsp;&nbsp;&nbsp;$designation<br><br>\n\n";
  }
}
}
$resultat .= "<hr>";
If(
$nombreTrouves < $limite)
{
$requete = "SELECT dns,designation
             FROM stock_dnsfr
             WHERE $where3
             LIMIT 0,"
.($limite-$nombreTrouves);
$results = mysql_query($requete,$connexion);
$nb_results = mysql_num_rows($results);
$nombreTrouves += $nb_results;
If(
$nb_results>0)
{
  While(
$row = mysql_fetch_row($results))
  {
   
$dns = $row[0];
   
$designation = $row[1];
   
$resultat .= "<b>$dns</b><br>\n&nbsp;&nbsp;&nbsp;$designation<br><br>\n\n";
  }
}
}

// Si pas de dns trouvés
If($nombreTrouves < 1)
{
// $clausefr
If(count($mot) > 1) {$s="s";}
$resultat = "Pas de nom de domaine trouvé pour le$s mot$s clé$s ";
For(
$index=1;$index<count($mot);$index++)
{
  If(
$index < count($mot)-1)
  {
   
$resultat .= "<b><i>".$mot[$index-1]."</i></b>, ";
  }
  Else
  {
   
$resultat .= "<b><i>".$mot[$index-1]."</i></b> $clausefr ";
  }
}
$resultat .= "<b><i>".$mot[$index-1]."</i></b>.";
}

Print(
$resultat);
?>