8791 sujets

Développement web côté serveur, CMS

Bonjour,
je suis en train de faire un moteur de recherche interne pour mon site.

1/ Je récupère le mot cle de recherche transmis par formulaire:
$recherche = $_POST['rech'];
$recherche = trim($recherche);


2/ je fais une recherche dans ma base de données (PHP5, utf8_unicode_ci)
Je souhaite que les mots recherché soient surlignés dans l'affichage final
$requete="SELECT * FROM table WHERE champ1 LIKE '%$recherche%' OR champ2 LIKE '%$recherche%''";
$resultat=mysql_query($requete) or die ("Problème lors de la requête. Erreur: ".mysql_error());

while($ligne=mysql_fetch_array($resultat)){
   $valeur1 = $ligne[champ1];
   $valeur2 = $ligne[champ2];
   
   // recherche et remplacement du mot de la recherche pour l'entourer d'un <span> de mise ne forme
   $pattern = '('. quotemeta($recherche) .')';
   $replacement = "<span class='selection'>\\1</span>";
   $valeur1 = eregi_replace($pattern, $replacement, $valeur1);
   $valeur2  = eregi_replace($pattern, $replacement, $valeur2);

   // Affichage du résultat mis en forme
   echo "<p>$valeur1 </p>";
   echo "<p>$valeur2 </p>";
}


Maintenant, je vous explique mon souci:
Quand je fais la recherche SQL, elle est insensible aux accents.
Quand je fais la recherche PHP, elle est insensible à la casse mais sensible aux accents.

Si je fais une recherche sur "pre":
- SQL va me retourner les enregistrements contenant "précision", "âpre", "premier",...
- PHP va uniquement surligner "âpre", "premier"

Mon problème est une incohérence des recherches. Je vais avoir des champs de texte sans rien de surligné, c'est déroutant pour l'utilisateur (et pour moi).

Je souhaite avoir deux recherches cohérentes:
Soit tout insensible aux accents // Soit tout sensible aux accents

J'ai essayé de remplacer tous les caractères accentués par leur équivalent sans accent. Le pb est que je me retrouve avec un texte de résultat sans les accents. Je veux un texte juste (accentué) en retour.

J'espère que qqn pourra m'aider!!

D'avance, merci,
Antonio
Salut Antonio et bienvenue, Smiley smile

ça risque d'être un peu lourd mais tu pourrais t'arranger pour alimenter un array $pattern avec les différentes possibilités d'accents :
<?php
$recherche = 'pre';

$accent['e'][0] = 'e';
$accent['e'][1] = 'é';
$accent['e'][2] = 'è';
$accent['e'][3] = 'ë';
$accent['e'][4] = 'ê';
$accent['a'][0] = 'a';
$accent['a'][1] = 'à';
$accent['a'][2] = 'ä';
$accent['a'][3] = 'â';
// etc.

$nb_patterns = 1;
for($i = 0; $i < strlen($recherche); $i++) {
	$nb_accents[$i] = (count($accent[$recherche[$i]]) > 0) ? count($accent[$recherche[$i]]) : 1;
	$nb_patterns *= $nb_accents[$i];
}

$chaines = array();
for($i = 0; $i < strlen($recherche); $i++) {
	for($j = 0; $j < $nb_patterns; $j++) {
		if(count($accent[$recherche[$i]]) > 0) {
			$chaines[$j][$i] = $accent[$recherche[$i]][$j % $nb_accents[$i]];
		} else {
			$chaines[$j][$i] = $recherche[$i];
		}
	}
}

$pattern = array();
for($j = 0; $j < $nb_patterns; $j++) {
	$pattern[$j] = '#('.implode('', $chaines[$j]).')#i';
}

$replacement = '<span style="background-color:yellow;">\\1</span>';
$chaine = 'la première fois il avait prévu de voir le Président près de la fontaine...';
echo '<p>'.preg_replace($pattern, $replacement, $chaine).'</p>';
?>
Sinon je ne vois pas... Smiley hmm
Modifié par Heyoan (08 Apr 2009 - 01:44)
Heyoan a écrit :
ça risque d'être un peu lourd

Salut,

En effet, ça l'est, surtout quand on sait que ça peut être fait en une ligne. Smiley lol

echo strtr( $string, 'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ', 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY' );
Agylus a écrit :
En effet, ça l'est, surtout quand on sait que ça peut être fait en une ligne. Smiley lol
Euh... oui mais non ! Smiley langue

Je ne parlais pas de remplacer tous les accents mais de créer tous les cas de patterns possibles. Smiley cligne