Str_replace et strpos bloquent sur les accents :-(

Résolu/Fermé
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 - 6 déc. 2013 à 10:53
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 - 10 déc. 2013 à 12:19
Bonjour à tous,

Je cherche à faire un script de scraping qui vérifie la présence de certains mots-clefs dans une des pages de mon site. A priori, c'est très basique, sauf que ça ne fonctionne que si ce mot-clef est sans accent, je ne comprends pas pourquoi...
J'ai donc ajouté une fonction pour supprimer tous les accents avec str_replace, mais là non plus, ça ne fonctionne pas, ça ne reconnait pas les termes avec accents...
La page est en UTF-8 et j'ai même ajouté un mb_convert_encoding($val, 'UTF-8') pour que tout soit bien conforme, mais rien à faire...
Quelqu'un a une idée?
Merci d'avance pour votre aide !

13 réponses

Utilisateur anonyme
6 déc. 2013 à 12:04
Bonjour

Si ton texte est déjà en UTF-8, faire mb_convert_encoding($val, 'UTF-8') n'a pas de sens. Au mieux, ça ne fait rien, au pire, ça altère tes données.

Si tu travailles en utf8, il faut utiliser les fonctions multi-octets pour manipuler les chaînes, car les fonctions "de base" comme str_replace considèrent que 1 caractère = 1 octet, ce qui est faux avec UTF-8
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 12:08
Merci pour ta réponse
Je ne suis pas sûre d'avoir très bien compris, mais ça ne fonctionnait pas non plus sans mb_convert_encoding($val, 'UTF-8'), je l'ai ajouté au cas où et ça n'a rien changé en effet...
Je vais me renseigner en tout cas du coté des fonctions multi-octets, même si pour le moment je ne vois pas le rapport entre les octets et les accents ! :)
0
Utilisateur anonyme
6 déc. 2013 à 12:26
je ne vois pas le rapport entre les octets et les accents
Il est fondamental. Un bon conseil : renseigne-toi sur ce qu'est l'encodage UTF8, ça t'aidera à résoudre beaucoup de problèmes.
Disons pour simplifier que les lettres avec accent sont encodées sur plusieurs octets en UTF8, contrairement aux autres encodages. Comme str_replace "raisonne" sur des octets et non pas sur des caractères, il ne fonctionne pas comme tu t'y attendrais en UTF-8.
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 13:33
Ok, merci du conseil, je vais voir ça de plus près. :-)
En cherchant les fonctions multi-octets, j'ai trouvé les fonctions mb_ereg_replace et preg_replace qui semblent répondre à mon besoin, mais j'ai toujours eu bcp de mal avec les motifs, ce n'est vraiment pas ce que je préfère dans le php.. ;-)
C'est bien ce type de fonction que je dois utiliser?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 13:51
A priori, ça ne fonctionne pas non plus...
Voici ma fonction :

$patterns[0] = '/[á|â|à|å|ä]/';
$patterns[1] = '/[ð|é|ê|è|ë]/';
$patterns[2] = '/[í|î|ì|ï]/';
$patterns[3] = '/[ó|ô|ò|ø|õ|ö]/';
$patterns[4] = '/[ú|û|ù|ü]/';
$patterns[5] = '/æ/';
$patterns[6] = '/ç/';
$patterns[7] = '/ß/';
$replacements[0] = 'a';
$replacements[1] = 'e';
$replacements[2] = 'i';
$replacements[3] = 'o';
$replacements[4] = 'u';
$replacements[5] = 'ae';
$replacements[6] = 'c';
$replacements[7] = 'ss';

$output = preg_replace($patterns, $replacements, $string);


Mais le texte à l'arrivée a toujours ses accents... :'-(
0
Je ne sais pas exactement ce que tu cherches à faire, mais mb_ereg_replace peut probablement t'être utile. Quant à preg_replace, tu aurais exactement le même problème qu'avec str_replace (Edit : non, pas vrai).

Il y a peut-être une manière simple de contourner le problème. Si le but est de faire disparaître les accents, commence par ré-encoder tes données d'entrée en autre chose qu'UTF8, par exemple iso8859-1. Ensuite, avec str_replace, tu remplaces tous les caractères accentués par les mêmes sans accents : puisque ce n'est pas de l'UTF8, ça va marcher ( à condition le texte à modifier ET la liste des caractères à substituer soient bien TOUS LES DEUX en iso8859-1). S'il ne reste plus d'accents, il est inutile de refaire l'encodage à l'envers ensuite.
Mais n'oublie pas les ç et autres ñ. Je ne parle pas d'€.
0
Edit :

As-tu lu la doc de preg_replace ?. Fais une recherche sur "utf" sur cette page, tu verras entre autres le commentaire de denis_truffaut.
C'est une solution qui a l'air propre.
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 14:40
Hou la la... Je te remercie beaucoup pour ton aide, mais là je suis de plus en plus larguée, là, ça dépasse mon petit niveau de dévelopeuse ! lol
et surtout je n'en reviens pas que ce soit si complexe de modifier des caractères
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 15:35
Le pb n'est toujours pas réglé, mais une partie du pb venait de l'encodage de la page scrapée, qui était en iso ;-)
0
Utilisateur anonyme
6 déc. 2013 à 16:25
Il n'y a rien de compliqué, il faut savoir ce qu'est un encodage. Le savoir vraiment, pas à peu près. Et surtout pas s'imaginer qu'on va gagner du temps en négligeant d'apprendre les notions fondamentales et qu'on y arrivera bien en tâtonnant.

Tu disais dans ton premier message que ta page était en UTF8, maintenant elle est en iso...

Si ça n'a pas marché alors que la page était en iso, c'est peut-être que ton script, lui, était encodé en UTF-8. Maîtrises-tu bien l'encodage de test scripts (je parle bien des scripts, pas de pages de ton site) ?
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
6 déc. 2013 à 19:42
Non, je ne maîtrise pas du tout! :-)
Je suis une développeuse autodidacte, je code depuis 5 ou 6 ans en php, c'est une vraie passion, mais j'ai encore beaucoup de choses à apprendre, c'est évident et je progresse un peu plus à chaque fois que je suis confrontée à une nouvelle problématique. Ce n'est pas que je cherche à tâtonner, mais vu que ce n'est pas mon métier ni mon activité n°1, je n'ai jamais eu la possibilité de faire une vraie formation poussée. Je fais de mon mieux pour progresser... :-)
La page qui est en utf-8 c'est celle sur laquelle j'ai mon script de scraping, et je n'avais pas fait attention qu'au moment de la recherche de mot-clef, la balise head du site scrapé était toujours incluse dans ma variable $resultat, d'où l'iso.
0
Utilisateur anonyme
6 déc. 2013 à 23:00
Si ça peut te rassurer, je suis aussi autodidacte et ce n'est pas mon métier non plus. Comme, je crois, beaucoup de gens ici. Mais là n'est pas la question.
Mini-cours (très schématique) sur l'encodage :
Les caractères "simples" sont codés sur un seul octet (de 0 à 127) de la même manière en ISO8859-1 et en UTF8.
Pour les caractères accentués etc, ça n'est plus pareil : ISO8859-1 les encode sur un seul octet (de 128 à 256) mais UTF8 les encode sur plusieurs (généralement 2) octets.
Par exemple é est codé E9 ( ISO8859-1 en hexadécimal) ou C3 A9 (UTF8).

Première remarque : c'est ton éditeur de texte qui détermine l'encodage de ton script et de ta page. S'il travaille en UTF8, il va mettre C3 A9 chaque fois que tu tapes un "é" ; s'il travaille en ISO8859-1, il va mettre E9. Si toi tu déclares dans tes balises head que tu travailles avec un encodage, alors qu'en fait tu écris avec un autre, tu trompes le navigateur qui essaye d'afficher ta page, et il va afficher n'importe quoi. Il est donc très important de régler son éditeur de texte sur le bon encodage.

Ensuite : Quand dans ton script tu écris $patterns[1] = '/[ð|é|ê|è|ë]/';, le contenu réel de $patterns[1] dépend de l'encodage avec lequel tu as écrit ton script. Si tu as écrit ton script en utf8, il y a deux octets entre chaque | dans ton pattern. Si tu t'en sers pour faire une recherche sur une page qui n'est pas en utf-8, ça ne peut pas marcher. Soit tu convertis ton motif en iso8859-1, soit tu convertis ta page en UTF8. Dans ce dernier cas, si j'en crois la remarque de denis truffaut (mon message #7) il faut mettre un 'u' à la fin du motif pour indiquer qu'on travaille en utf8.
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
7 déc. 2013 à 02:04
Super, merci beaucoup pour ton aide et ta patience!
Je vais me pencher sérieusement sur la question, pcq c'est assez rare que je sois confrontée à des problèmes d'encodage, mais le fait est que ce n'est pas la première fois, et ça vaut le coup que je me forme une fois pour toutes ! J'arrête pour aujourd'hui, mais je vais tester ça demain :-)
0
Utilisateur anonyme
7 déc. 2013 à 09:02
Bon courage :-)
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
10 déc. 2013 à 12:19
J'ai résolu le problème! :-)
J'avoue que je n'ai toujours pas très bien saisi toutes les subtilités de l'encodage, mais j'ai contourné le problème en passant tout en iso, et ça fonctionne impeccable.
Merci encore pour ton aide ! :-)
0