Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 17h50   #1
xtremdisc
Invité de passage
 
Inscription : octobre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 27
Points : 2
Points : 2
Par défaut Utilisation un peu spéciale de preg_replace pour moteur de recherche

Bonjour à tous,

Désolé pour le titre je ne voyais pas comment l'expliquer en quelques mots.

Voici le contexte:
Je réalise un moteur de recherche sur des pages de contenu (type CMS).
Les textes contenus dans la base de données sont encodés en HTML, j'ai donc tous mes accents convertis, par exemple "é" dans ma base est "é " (j'utilise tinyMCE).

Lorsque le visiteur tape un mot sans accent j'aimerai pouvoir le chercher et le trouvé même si il a un accent.
exemple :
mot saisie par le visiteur : preference
j'aimerai que ça me trouve : préférence

Voici le code que j'utilise :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
$pattern = array();
$pattern[0] = '/e/';
$pattern[1] = '/a/';
$pattern[2] = '/i/';
$pattern[3] = '/o/';
$pattern[4] = '/u/';
$pattern[5] = '/c/';
 
$replace_html = array();
$replace_html[0] = "(e|é|É|è|È|ê|Ê|ë|Ë)";
$replace_html[1] = "(a|à|À|â|Â|ä|Ä)";
$replace_html[2] = "(i|î|Î|ï|Ï)";
$replace_html[3] = "(o|ô|Ô|ö|Ö)";
$replace_html[4] = "(u|ù|Ù|û|Û|ü|Ü)";
$replace_html[5] = "(c|ç|Ç)";
 
$motscles = $_GET["motscles"];
$motscles = mysql_real_escape_string(trim($motscles));
if(!empty($motscles)) {
	$tab_mc = explode(" ",$motscles);
	$cptmot = 0;
	foreach($tab_mc as $k => $mot) {
		if(strlen($mot) > 2) {
			$mothtml = $mot;
			$motreg = $mot;
			$motreg = preg_replace($pattern,$replace_accent,$motreg);
			$mothtml = preg_replace($pattern,$replace_html,$mothtml);
			$mothtml = htmlentities($mothtml);
			if($cptmot > 0) $param_txt .= " AND ";
			$param_txt .= "T.contenu REGEXP '[[:<:]]".$mothtml."[[:>:]]'";
			$cptmot++;
		}
	}
	if($cptmot) {
		$rcont = mysql_query("SELECT T.contenu, M.id, M.libelle FROM texte T 
								LEFT OUTER JOIN page_contenu P ON P.id = T.idcontenu 
								LEFT OUTER JOIN menu M ON P.idpage = M.id 
								WHERE ".$param_txt);
		$nbcont = mysql_num_rows($rcont);
 
 
	}
}
Le problème est qu'il me remplace le "e" par ce qu'il faut mais ensuite même les voyelles dans les chaines de remplacement sont aussi remplacer, ce qui donne un remplacement d'un remplacement et ainsi de suite.

Y a t'il un moyen de ne pas remplacer les chaines qui ont servies de remplacement.

J'espère être assez clair, n'hésitez pas si vous avez besoin de précisions.

Merci d'avance.
xtremdisc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 17h59   #2
Seb33300
Membre Expert
 
Avatar de Seb33300
 
Homme Sébastien Alfaiate
Développeur Web
Inscription : janvier 2007
Messages : 1 428
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Alfaiate
Âge : 27
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 1 428
Points : 1 913
Points : 1 913
Je ne sais pas si ton site contient beaucoup de pages, mais peut etre serait il plus judicieux de réenregisrer tes pages sans la converson de caractères.

Il existe un option qui permet de configurer TinyMCE de telle sorte à ce qu'il ne convertisse pas les caractères spéciaux.

Il faut passer l'option entity_encoding à raw.

http://www.tinymce.com/wiki.php/Conf...ntity_encoding
__________________
Zend Certified Engineer PHP 5.3

« Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana
Seb33300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 18h09   #3
xtremdisc
Invité de passage
 
Inscription : octobre 2008
Messages : 27
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 27
Points : 2
Points : 2
Merci Seb pour cette idée mais j'y avait déjà pensé.

Et en effet il y a beaucoup de page et de contenu déjà donc si je pouvais trouver une solution sans changer la configuration de tinyMCE, ça m'arrangerait bien.
xtremdisc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h02.


 
 
 
 
Partenaires

Hébergement Web