Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2011, 16h46   #1
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Par défaut Problème avec preg_replace

Dans mon application je recherche tous les textes qui contiennent un certain mot, par exemple Eglise, et je souhaite mettre les mots trouvés en surbrillance.
Tous les mots avec ou sans accents doivent être trouvés.

Pour ce faire je transforme le critère reçu (ici $critere="Eglise") avec des instructions preg_replace, c'est à dire dans le cas présent :

Code :
1
2
$critere = preg_replace('/[eèéêë]/i', '(e|è|é|ê|ë)', $critere);
$critere = preg_replace('/[iìíîï]/i', '(i|ì|í|î|ï)', $critere);
Ensuite je lance la recherche du critère dans mon texte avec une instruction preg_match :

Code :
$nb=preg_match_all($critere, $texte, $matches, PREG_OFFSET_CAPTURE);
Il se trouve que seuls Eglise et eglise sont trouvés, mais pas église

Merci à qui pourra me dire où est mon problème.
Caperquy
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h48   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
cherche du coté de l'encoding accepté par la fonction preg_replace. si tu n'as pas le bon encodage, ça marchera pas.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h20   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
ton preg_replace n'est pas bon :
église va devenir : (e|è|é|ê|ë)(e|è|é|ê|ë)glis(e|è|é|ê|ë)

si tu veux supprimer les accents fait :
Code :
1
2
$critere = 'église';
echo preg_replace('/[èéêë]/ui', 'e', $critere);
mais bon c'est de la bidouille tout ca...
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h52   #4
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Par défaut Problème avec preg_replace

Merci pour la réponse.
En fait je ne cherche pas à supprimer les accents, mais seulement à localiser le mot, qu'il ait ou non un accent.

CapErquy
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h55   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par CapErquy Voir le message
Merci pour la réponse.
En fait je ne cherche pas à supprimer les accents, mais seulement à localiser le mot, qu'il ait ou non un accent.

CapErquy
sauf qu'il fait la différence entre un mot avec accents et un mot sans accents, donc t'es bien obligé de tout mettre au même niveau, a la base c'est pour faire quoi ? ton texte il vient d'où ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 20h59   #6
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Mon texte vient d'une base de données MySQL dans laquelle se trouvent des résumés d'articles. L'utilisateur cherche à retrouver quels articles traitent d'un sujet identifié par le mot clé qu'il a choisi. En retour je veux lui renvoyer le ou les articles trouvés avec le ou les mots correspondants mis en surbrillance.
Au départ on ignore donc si dans les différents articles on trouvera le mot cherché avec ou sans accents.
CapErquy
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 09h32   #7
Membre régulier
 
Avatar de zugolin
 
Inscription : octobre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 239
Points : 98
Points : 98
euhh.... ça à l'air un peu costaud, non ?
car lui, il peut rechercher :
Eglise / église / eglise /eglises / églises / etc.... et sans compter les fautes (bon, là, c'est vrai , ça sera normal qu'il trouve pas, et pourquoi pas preciser "attention aux fautes" )
il faut donc peut etre recuperer le mot et chercher toutes les solutions
Eglise / église / eglise /eglises / églises
... a noter que si tu cherches eglises avec un "s" tu trouveras pas eglise sans "s"
et si tu cherches Eglise, comment tu peux savoir qu'on peux remplacer le "E" par un "é", et non pas par un "e" ....

... y'a du taffe , je pense , pour faire un bon moteur......!!
zugolin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 10h24   #8
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Merci à Zugolin pour la réponse.
Je ne suis pas concerné par les pluriels ou autres fautes qui sont inévitables, mais je veux juste retrouver les mots sans me soucier des majuscules ou minuscules, ni des caractères accentués que j'ai définis en utilisant les expressions régulières (voir mon premier message sur ce sujet).
Il se trouve que quand je soumets directement à mes instructions preg_replace et preg_match un texte dans lequel j'utilise les mots Eglise, église, eglise les trois écritures sont bien reconnues. Par contre je reçois mes données à partir d'une base de données MySQL et là çà ne marche plus. Je soupçonne un problème d'encoding mais je n'arrive pas à déterminer lequel.
D'où mon appel à l'aide
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 15h58   #9
Membre régulier
 
Avatar de zugolin
 
Inscription : octobre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 239
Points : 98
Points : 98
église, par exemple , il serait pas en html, dans ta bdd :
é => é
ou numérique => & # 233 ; (je mets des espaces, sinon, l'editeur re-interprete le code)

ou bien une histoire de utf8 ou iso-8859-1 ....?
faudrait plutot aller voir du coté mysql, alors...non?
zugolin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 19h08   #10
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Non je n'utilise pas les symboles tels que é dans ma base de données. J'ai essayé de basculer ma table en utf8_general_ci ; les mots tels que église sont alors bien retrouvés mais c'est également tout l'ensemble des caractères accentués qui apparaissent alors sous la forme � lors de l'affichage.
MySQL ne me propose pas l'option iso-8859-1
Je désespère de trouver une solution. En tous cas merci d'avoir essayé de m'aider
CapErquy
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 19h25   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
tu fais pas la recherche direct dans la requete SQL ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2011, 20h53   #12
Membre régulier
 
Avatar de zugolin
 
Inscription : octobre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 239
Points : 98
Points : 98
c'est peut etre ta page php elle meme qui pourrait avoir des problemes d'encodage, alors ;
du coté du doctype :
Citation:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
... ou bien une erreur d'encodage de la page ; si tu travails avec notepad++, comme moi, j'envoi la page en => format: convertir en format unix // encoder en ainsi ... y'aurait pas un soucis vers là ?
zugolin est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/02/2011, 21h03   #13
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Citation:
Envoyé par CapErquy Voir le message
Non je n'utilise pas les symboles tels que &eacute; dans ma base de données. J'ai essayé de basculer ma table en utf8_general_ci ; les mots tels que église sont alors bien retrouvés mais c'est également tout l'ensemble des caractères accentués qui apparaissent alors sous la forme � lors de l'affichage.
MySQL ne me propose pas l'option iso-8859-1
Je désespère de trouver une solution. En tous cas merci d'avoir essayé de m'aider
CapErquy
Il faut que toutes les entêtes concordent pour ne pas avoir des erreurs d'affichage en utf-8.

Si tu ne veux pas utiliser l'utf-8 essayes l'Interclassement latin1_swedish_ci
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 02h43   #14
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
Code php :
$critere = preg_replace('/[eèéêë]/iu', '[eèéêë]', $critere);
et pour le code en entier avec fonction de surbrillance voici un lien :
http://php.net/manual/fr/function.preg-replace.php
regarde highlighter dans les codes en dessous de la description de la fonction preg_replace.
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 14h41   #15
Invité de passage
 
Inscription : novembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 12
Points : 0
Points : 0
Réponse à vorace :
je viens d'essayer ta formule :

Code :
$critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
mais j'obtiens le message d'erreur suivant :

preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 3
CapErquy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 14h51   #16
Membre régulier
 
Avatar de zugolin
 
Inscription : octobre 2007
Messages : 239
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 239
Points : 98
Points : 98
Code php :
$critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
..une histoire de delimiteur, non ?
Code php :
$critere = preg_replace('#[eèéêë]#iu', '(eèéêë)', $critere);
... ou quelque chose comme ça ......
zugolin est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/02/2011, 16h27   #17
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
si tu utilise notepad++, converti ton fichier en utf-8 (sans-BOM) et enregistre, voila pourquoi tu as cette erreur, tu n'as pas enregistré ton fichier en utf-8, si tu utilise un autre editeur (je ne connais pas les autres) ca doit etre faisable aussi et tu pourras utiliser le code que je t'ai donné, de plus dans la fonction preg_replace pour le second parametre tu dois mettre des [] a la place des parentheses.
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 22h35   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par CapErquy Voir le message
Réponse à vorace :
je viens d'essayer ta formule :

Code :
$critere = preg_replace('/[eèéêë]/iu', '(eèéêë)', $critere);
mais j'obtiens le message d'erreur suivant :

preg_replace() [function.preg-replace]: Compilation failed: invalid UTF-8 string at offset 3
est ce que tu comprends ce que va faire le regexp la ???
parce que je t'ai deja dis ce que sa donne et visiblement personne percute :
http://www.developpez.net/forums/d10...e/#post5750378
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 22h45   #19
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
le but étant de mettre en surbrillance les mots telsque Eglise, église ou eglise si le mot rechercher est eglise donc une recherche indépendamment des accents le bout de code que j'ai mis provient de celui-ci :
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
<?php
function prepare_search_term($str,$delim='#') {
    $search = preg_quote($str,$delim);
 
    $search = preg_replace('/[aàáâãåäæ]/iu', '[aàáâãåäæ]', $search);
    $search = preg_replace('/[eèéêë]/iu', '[eèéêë]', $search);
    $search = preg_replace('/[iìíîï]/iu', '[iìíîï]', $search);
    $search = preg_replace('/[oòóôõöø]/iu', '[oòóôõöø]', $search);
    $search = preg_replace('/[uùúûü]/iu', '[uùúûü]', $search);
    // add more characters...
 
    return $search;
}
 
function highlight($searchtext, $text) {
    $search = prepare_search_term($searchtext);
    return preg_replace('#' . $search . '#iu', '<span style="background-color:red">$0</span>', $text);
}
 
$testtext = 'cafe cáfé càfè CAFE CÁFÉ CÀFÈ càfé cáfè CÀFÉ CÁFÈ';
echo highlight('cafe',$testtext) . '<br />';
echo highlight('cáfé',$testtext) . '<br />';
echo highlight('CAFE',$testtext) . '<br />';
echo highlight('CÀFÉ',$testtext) . '<br />';
?>
en utf-8 ca marche très bien, à savoir fichier codé en utf-8 et page html en utf-8 aussi.
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 22h55   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
arf la bidouille...
et si tu mets cafette, il va ca mettre le mettre en surbrillance aussi et que le bout cafe
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h15.


 
 
 
 
Partenaires

Hébergement Web