Page 1 sur 1

problème expression régulière

Posté : 13 nov. 2008, 10:57
par nicolas37
Bonjour à tous,

je rencontre un problème avec preg_replace et les assertions pour mettre en surbrillance un mot précis dans une chaine.

voici mon code exemple :

Code : Tout sélectionner

$test = "professionnel de santé"; echo preg_replace('#\bsanté?\b#', "<span class=\"surbrillance\">santé</span>", $test);
Il met bien en surbrillance "santé", seulement il me double le "é" de santé !!! pourquoi ?
J'ai copié mon exemple sur le site http://lumadis.be/regex/test_regex.php et ça fonctionne sans problème en me donnant la même syntaxe ('#\bsanté?\b#')...

Avez-vous une idée ?

merci

Posté : 13 nov. 2008, 11:05
par Berzemus
Quel est l'encodage de ton fichier ?

Je pense qu'il devrait être en UTF8, et s'il ne l'est pas, c'est probablement de la que vient l'erreur, puisque les regex sous php fonctionnent en interne en utf8.

Posté : 13 nov. 2008, 11:22
par Invité
Quel est l'encodage de ton fichier ?

Je pense qu'il devrait être en UTF8, et s'il ne l'est pas, c'est probablement de la que vient l'erreur, puisque les regex sous php fonctionnent en interne en utf8.

Mon fichier est ISO-8859-1.
Il faut que je passe mon charset en UTF8 ??

Posté : 13 nov. 2008, 11:45
par Berzemus
Quel est l'encodage de ton fichier ?

Je pense qu'il devrait être en UTF8, et s'il ne l'est pas, c'est probablement de la que vient l'erreur, puisque les regex sous php fonctionnent en interne en utf8.

Mon fichier est ISO-8859-1.
Il faut que je passe mon charset en UTF8 ??
Oui bibi ! Ou que tu encode la chaine a traiter avec utf8_encode()

Posté : 13 nov. 2008, 12:01
par Invité
Quel est l'encodage de ton fichier ?

Je pense qu'il devrait être en UTF8, et s'il ne l'est pas, c'est probablement de la que vient l'erreur, puisque les regex sous php fonctionnent en interne en utf8.

Mon fichier est ISO-8859-1.
Il faut que je passe mon charset en UTF8 ??
Oui bibi ! Ou que tu encode la chaine a traiter avec utf8_encode()

Ok, problème résolue. Merci.
Seulement je rencontre un autre problème (c'est toujours avec les exp donc je reste sur le même post)

Je souhaite appliquer ma surbrillance à partir de données récupéré d'une base. Je compare la chaine recherché dans le champs de la base. Lorsqu'il y a plusieurs mots dans la recherche, je stock chaque mot dans un tableau. Je boucle sur mes mots, et j'applique un style dès qu'il trouve la correspondance. Voici le code.

Code : Tout sélectionner

for ($j=0;$j<$nb_mots_surbrillance;$j++){ $chaine_titre = preg_replace("#\b$tab_surbrillance[$j]\b#i","<span class="surbrillance">$tab_surbrillance[$j]</span>", $chaine_titre); $chaine_resume = preg_replace("#\b$tab_surbrillance[$j]\b#i","<span class="surbrillance">$tab_surbrillance[$j]</span>", $chaine_resume); $motscles = preg_replace("#\b$tab_surbrillance[$j]\b#i","<span class=surbrillance>$tab_surbrillance[$j]</span>", $motscles); }
En résultat j'ai ça :

Code : Tout sélectionner

les conventions nationales avec les <span class="surbrillance">professionnelsspan> de santé. (Vu(s) 36 fois)
J'ai un problème avec le "span" et j'ignore quoi.
merci de votre aide.

Posté : 13 nov. 2008, 13:29
par Berzemus
Et en sortant tes variables de tes chaines, pour faire plus propre ?
for ($j=0;$j<$nb_mots_surbrillance;$j++){
          $chaine_titre = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class=\"surbrillance\">".$tab_surbrillance[$j]."</span>", $chaine_titre);
          $chaine_resume = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class=\"surbrillance\">".$tab_surbrillance[$j]."</span>", $chaine_resume);
          $motscles = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class=surbrillance>".$tab_surbrillance[$j]."</span>", $motscles);
         } 

Posté : 13 nov. 2008, 14:47
par Invité
Et en sortant tes variables de tes chaines, pour faire plus propre ?
for ($j=0;$j<$nb_mots_surbrillance;$j++){
          $chaine_titre = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class="surbrillance">".$tab_surbrillance[$j]."</span>", $chaine_titre);
          $chaine_resume = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class="surbrillance">".$tab_surbrillance[$j]."</span>", $chaine_resume);
          $motscles = preg_replace("#\b".$tab_surbrillance[$j]."\b#i","<span class=surbrillance>".$tab_surbrillance[$j]."</span>", $motscles);
         } 

Yes ! c'est OK, plus ce problème, mais un autre apparait mais plus vicieux !
Dès que je recherche un mot se terminant par un accent genre "santé", il n'est pas pris en surbrillance.
Mais en tenant compte de l'encodage (voir 1er pb plus haut).
Une idée ?

Merci

Posté : 13 nov. 2008, 18:02
par thehawk
Bien le bonjour

Une solution de brute :

Tu explode avec " " (Espace) et enfin tu boucle avec $ en début et ^ en fin dans ton regex
#\b$santé^?\b#
(Houla je sais plus l'ordre :) )

(Oui j'avais prévenu)

Autre solution a mes yeux :
#\b santé ?\b#
avec un espace avant après

Il doit certainement y avoir une solution "propre" mais bon :)

Bye Hawk