<?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 $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 $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 $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);
?>