Problème RegEx et accent

Problème RegEx et accent - PHP - Programmation

Marsh Posté le 11-09-2014 à 12:07:38    

Bonjour,
Je fais un moteur de recherche de en autocomplete qui cherche dans plusieurs champs dans ma base.
Pas de problème au niveau de ma requête, mon MATCH AGAINST (nom, prenom) AGAINST ('+Stephane*') me renvoie bien les lignes qui ont Stephane et ou Stéphane
Par contre en php je fais des regex pour mes résultats pour savoir dans quel colonne se trouve mon résultat positif.

Code :
  1. while($row = mysql_fetch_row($res)) {
  2. $result = preg_match('#('.$word.'[a-z0-9-]*)#ui', $row[0], $matches);
  3. foreach($matches as $word) {
  4.  $word = mb_strtolower($word, "UTF-8" );
  5.  $t_find_p[$word] = 1;
  6. }
  7. $result = preg_match('#('.$word.'[a-z0-9-]*)#ui', $row[1], $matches);
  8. foreach($matches as $word) {
  9.  $word = mb_strtolower($word, "UTF-8" );
  10.  $t_find_n[$word] = 1;
  11. }
  12. }


Le but de la manœuvre étant aussi d'afficher le mot complet, le mec rentre "ste" je lui affiche "prenom : Stéphane"
 
Ça marche si le mec rentre sa recherche avec accent car ma regex sera bonne, par contre si on rentre sans accent, ma regex ne match pas...
 
Auriez vous une solution (PHP ou SQL) à mon problème ?


---------------
D3
Reply

Marsh Posté le 11-09-2014 à 12:07:38   

Reply

Marsh Posté le 11-09-2014 à 14:23:45    

Personne ?
 
J'ai pensé a passer mon $word, $row[0] et $row[1] a un str_replace pour remplacer tous les caractères accentué par leur équivalent non accentué mais du coups je renverrais un résultat "faux" à mon autocomplete...
 
Y'a pas un flag spécifique ou une astuce autre propre au regex pour les rendre accent-insensitive ?


---------------
D3
Reply

Marsh Posté le 11-09-2014 à 16:17:16    

Salut,
 
Pour tes accents, pas à ma connaissance...
 
En revanche tu dois échapper ta variable.
Quand on concatène une chaîne dans une regexp on s'expose au risque que le caractère de délimitation de regexp (ici la dièse # ) soit présent dans la chaîne concaténée.
 
Donc :
 

Code :
  1. preg_match('#('.$word.'[a-z0-9-]*)#ui', $row[0], $matches);


 
Deviendrait :
 

Code :
  1. preg_match('#('.preg_quote($word, '#').'[a-z0-9-]*)#ui', $row[0], $matches);

Reply

Marsh Posté le 11-09-2014 à 16:58:23    

Merci, je n'y avais pas pensé...
 
...peu de chance qu'un utilisateur rentre un # mais quand même. ^^
 
Du coups pour mon problème j'ai fait une manip de conversion sans accent :

Code :
  1. $match = iconv("UTF-8", 'ASCII//TRANSLIT//IGNORE', $row[1]);


Ça fonctionne mais c'est un peu dommage d'avoir mon retour en autocomplete sans les accents. :-/


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed