[php]accent, caractères spéciaux, strtr

accent, caractères spéciaux, strtr [php] - PHP - Programmation

Marsh Posté le 19-11-2004 à 18:03:57    

Bonjour à tous,  
 
après avoir récurer google, je ne trouve toujours pas réponse à mon problème.  
 
Je désire tranformé une chaîne de caractères en chaine de caractères sans caractères spéciaux, ni accent et avec les expaces en _.
 
Pour les espaces, j'ai trouvé(pas vraiment en réalité) à pour les espaces :

Code :
  1. eregi_replace("[^a-z0-9A-Z]", "_", $titre)

 
 
Maintenant je cherche pour mofifier la casse.
Et le pire, remplacer les lettres accentuées par leu "équivalent non accentué"
Et enfin, viré les characctères non alphanumérique.
 
Merci


Message édité par opgang le 21-11-2004 à 12:26:07

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 19-11-2004 à 18:03:57   

Reply

Marsh Posté le 20-11-2004 à 11:00:30    

Alors, même pas une petite piste pour m'aider.
 
Même un lien vers un bon tutoriel vers les regex serait le bienvenu.


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 20-11-2004 à 11:37:33    

T'as pas spécialement besoin de regex, utilise plutot des fonctions comme strtr.

Reply

Marsh Posté le 20-11-2004 à 11:48:47    

strtolower()
str_replace()


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 20-11-2004 à 11:54:16    

Minuscule :
strtolower
 
Pour virer les accents (il y a peut-être pas tout) :
 

Code :
  1. $texte =  strtr( $texte, 'àâäîïôöùûüéèêëç', 'aaaiioouuueeeec' );


 
Pour virer les espaces tu peux écrire :

Code :
  1. str_replace( array( ' ', '\t', '\r', '\n' ), '_', $texte );


 
 
 
Enfin pour virer les non alphanum (non testé [:joce]  ) :

Code :
  1. ereg_replace ("[^a-z0-9_]", "", $string);


Message édité par pascal_ le 20-11-2004 à 11:57:09
Reply

Marsh Posté le 20-11-2004 à 12:43:12    

Merci beaucoup, il ne me reste plus qu'à tester ça.  
 
Pour les accentes j'ai trouver ça :  

Code :
  1. "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
  2.                  "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ) );


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 20-11-2004 à 12:49:29    

Je dirai plutot "eregi_replace" plutot que "ereg_replace" (insensible à la casse).
Enfin tout dépend de l'ordre de ton traitement, car après un strtolower() c'est moins important. :o


Message édité par kfman le 20-11-2004 à 12:50:38
Reply

Marsh Posté le 21-11-2004 à 12:16:35    

Rebonjour,  
 
J'ai éssayé, bidouillé, modifié...
Ca ne fonctionne pas correctement avec les accents.
Voici la partie du code que j'ai refais :

Code :
  1. Function removeaccents($titre){
  2.    $titre= strtr($titre,  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
  3.   "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" );
  4.    return $titre;
  5.    }
  6.   $req = mysql_query("select * from news LIMIT 5" ) or die ('ERREUR '.$req.' '.mysql_error());
  7.   while($contenu=mysql_fetch_array($req))
  8.   { 
  9.     $titre = $contenu[titre];
  10.     $titre = removeaccents($titre);
  11.     $titre = str_replace( array( ' ', '\t', '\r', '\n' ), '_', $titre );
  12.     echo "\t\t\t\t\t<h3><a href=\"news-$contenu[id]-"."$titre".".html\">$contenu[titre]</a></h3>\n";


 
Le résultat est le suivant :

Code :
  1. <h3><a href="news-1-Ouverture_du_r&eacute;seau.html">Ouverture du r&eacute;seau</a></h3>
  2. <h3><a href="news-2-Construction_du_site.html">Construction du site</a></h3>


 
Pour la casse, je me suis arrangé au niveau de l'url rewriting, mais pour les accents... Rien à faire, ça ne veux pas.  
 
Une idée (peut-être au niveau de l'url rewriting)?


Message édité par opgang le 21-11-2004 à 12:27:50

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 12:48:43    

Apparemment tu aurais des entités html dans ta base (&eacute). Comment ça se fait ?
 
T'as pas un lien vers ton site ?


Message édité par kfman le 21-11-2004 à 12:49:11
Reply

Marsh Posté le 21-11-2004 à 13:10:34    

Très intérréssant ta remarque, je n'y pensais plus à mes entités...
Le site est valid xhtml1.1, par conqéuent, j'éssaye de remplacer tout les caractères accentués par leur entité.
L'adresse du site :  
http://www.eurotchat.info
Il faut regarder en bas de la page pour les news.


Message édité par opgang le 21-11-2004 à 13:12:00

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 13:10:34   

Reply

Marsh Posté le 21-11-2004 à 13:14:29    

En fait, l'idée est d'avoir tes données dans la base utilisant le jeu de caractères "normal". La conversion des entités html intervenant lors de l'affichage avec des fonctions comme htmlentities().


Message édité par kfman le 25-11-2004 à 18:53:59
Reply

Marsh Posté le 21-11-2004 à 13:20:29    

Uhm, UHm, en gros, j'écris normalement mes news avec les accents. Ensuite, je supprime les accents pour mettre le titre dans l'url et en même temps, je convertit les accents en entité pour les titres sur la page.
Allez, c'est partit, on va tester ça !
 
PS : pour parler d'url rewriting, c'est dans quel forum ?
 
Edit : je viens de remplacer mes entités par leur équivalent accentué dans ma base et voilà le résultat :

Code :
  1. news-1-Ouverture_du_r%EF%BF%BDseau.html


Message édité par opgang le 21-11-2004 à 13:22:58

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 17:21:04    

Je viens d'y penser, un exemple concret : http://forum.hardware.fr/hardwaref [...] 0250-1.htm
http://forum.hardware.fr/hardwaref [...] 0250-1.htm
 
Le titre est dans l'url contient le titre de la page. C'est exactement ce que je veux faire. Le titre à été "nettoyé".


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 17:43:33    

Ok, pour récupérer la chaine venant de l'url en clair tu fais un rawurldecode().
 
Sinon, pourquoi passes-tu le texte du titre dans l'url ? Tu n'as pas d'id numérique ?

Reply

Marsh Posté le 21-11-2004 à 17:57:56    

Enfaite, je ne récupère pas la chaine provenant de l'url, c'est un peux l'inverse.  
En réalité(je vais éssayer d'être clair) : j'ai normalement une adresse de départ du type :  
index.php?go=news&id=2  où news ne change pas et 2 est le numéro de la news qui change à chaque news.  
Ce que je veux obtenir grave à php et à l'url rewriting :  
news-2-le_titre_de_la_news.html
Pour celà, j'ai mis en place une  règle de réécriture qui est :  

Code :
  1. RewriteRule ^news-([0-9]+)-([a-z_]*).html$ index.php?go=news&id=$1&titre=$2 [NC]


 
Au niveau php, je creéer le lien avec l'id et puis je rajoute le titre de "épuré" de la news dans l'adresse. Un peu comme ce forum.  tester ces deux url :  

Code :
  1. http://forum.hardware.fr/hardwaref [...] 0250-1.htm
  2. http://forum.hardware.fr/hardwaref [...] 0250-1.htm


 
Je pense qu'il n'y a que "60250-1" qui est pris en compte, moi c'est éxactement pareil.


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 18:15:04    

T'as essayé de faire des echo à chaque étape du traitement de $titre ?

Reply

Marsh Posté le 21-11-2004 à 18:22:46    

Aller c'est partit on va voir ce que ça donne :  

Code :
  1. $titre = $contenu[titre];
  2.     echo "$titre"."<br />";
  3.     $titre = removeaccents($titre);
  4.     echo "$titre"."<br />";
  5.     $titre = str_replace( array( ' ', '\t', '\r', '\n' ), '_', $titre );
  6.     echo "$titre"."<br />";
  7.     echo "\t\t\t\t\t<h3><a href=\"news-$contenu[id]-"."$titre".".html\">$contenu[titre]</a></h3>\n";
  8.     echo "$titre"."<br />";


la fonction est

Code :
  1. Function removeaccents($titre){
  2.    $titre= strtr($titre,  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
  3.   "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" );
  4.    return $titre;


 
le résultat est disponible(en bas) sur http://www.eurotchat.info pour vous rendre vraiment compte. le deuxième lien fonctionne car pas d'accents et le premier déconne.


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 18:28:00    

Chez moi :

Code :
  1. Function removeaccents($titre){ 
  2.    $titre= strtr($titre,  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
  3.   "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" ); 
  4.    return $titre; 
  5. //$titreOriginal = "Ouverture du réseau !";
  6. $titreOriginal = " Qu'est ce que ça : €§µ@#~& ?";
  7. $titre = strtolower( $titreOriginal );
  8. $titre = removeaccents($titre);
  9. $titre = str_replace( array( ' ', '\t', '\r', '\n', '\'' ), '_', $titre );
  10. $titre = ereg_replace ("[^a-z0-9_]", "", $titre);
  11. $titre = ereg_replace ("_+", "_", $titre);
  12. $titre = ereg_replace ("(^_)|(_$)", "", $titre );
  13. echo "<html><body>";
  14. echo "<h3><a href=\"news-2-"."$titre".".html\">$titreOriginal</a></h3>\n";
  15. echo "<h4> $titre </h4>";
  16. echo "</body></html>";


 
fonctionne parfaitement...
 
 
Tu as vérifié ce que tu avais dans la base ?

Reply

Marsh Posté le 21-11-2004 à 18:40:42    

Oula ça m'énerve cette histoire :fou:  
Voici le contenu de ma base de news :  

Code :
  1. <news>
  2.         <id>1</id>
  3.         <titre>Ouverture du r&amp;eacute;seau</titre>
  4.         <date>2004-11-14</date>
  5.         <contenu>Le r&amp;eacute;seau ouvre ses portes. </contenu>
  6.         <auteur>opgang</auteur>
  7.     </news>
  8.     <news>
  9.         <id>2</id>
  10.         <titre>Construction du site</titre>
  11.         <date>2004-11-14</date>
  12.         <contenu>Le site est toujours en construction. </contenu>
  13.         <auteur>opgang</auteur>
  14.     </news>
  15.     <news>
  16.         <id>3</id>
  17.         <titre>Petit test avec é à accent</titre>
  18.         <date>2004-11-21</date>
  19.         <contenu>Petit test</contenu>
  20.         <auteur>opgang</auteur>
  21.     </news>


Voici ensuite le CS de ma page consacré aux news que j'ai modifié pour qu'il soit comme pascal_

Code :
  1. echo "\t\t\t\t<div id=\"news\">\n"
  2.       ."\t\t\t\t\t<h1>News</h1>\n";
  3.        Function removeaccents($titre){
  4.    $titre= strtr($titre,  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
  5.   "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" );
  6.    return $titre;
  7.    }
  8.   $req = mysql_query("select * from news LIMIT 5" ) or die ('ERREUR '.$req.' '.mysql_error());
  9.   while($contenu=mysql_fetch_array($req))
  10.   { 
  11.   $titre = $contenu[titre];
  12.   $titre = strtolower($titre);
  13.   $titre = removeaccents($titre); 
  14.   $titre = str_replace( array( ' ', '\t', '\r', '\n', '\'' ), '_', $titre ); 
  15.   $titre = ereg_replace ("[^a-z0-9_]", "", $titre);
  16.   $titre = ereg_replace ("_+", "_", $titre);
  17.   $titre = ereg_replace ("(^_)|(_$)", "", $titre );
  18.   echo "\t\t\t\t\t<h3><a href=\"news-$contenu[id]-"."$titre".".html\">$contenu[titre]</a></h3>\n";


La source n'est pas éxactement la même mais j'ai mis sur le site un echo avec le nom de la ligne correspondante sur http://www.eurotchat.info
J'arrive à accédder aux news en ayant modifié les règles d'écriture, mais les caractères accentués ne sont pas remplacés, ils sont supprimés.


Message édité par opgang le 21-11-2004 à 18:44:47

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 18:50:37    

Ton éditeur de texte, il serait pas Unicode par hasard ? [:figti]
 
Essaye avec un encodage ISO-8859-1 dans ton code html.


Message édité par kfman le 21-11-2004 à 18:52:16
Reply

Marsh Posté le 21-11-2004 à 19:15:50    

Je suis en UTF-8 Pour tout le site.
on va voir en 8859-2 ( j'ai pas le 1)
c'est correct pour l'url mais plus pour le titre original.
Et surtout, la page n'est plus valid xhtml

Citation :

Sorry, I am unable to validate this document because on line 68  it contained one or more bytes that I cannot interpret as utf-8 (in other words, the bytes found are not valid values in the specified Character Encoding). Please check both the content of the file and the character encoding indication.


Message édité par opgang le 21-11-2004 à 19:18:40

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 19:21:19    

Essaye le iso-8859-15 (si tu l'as). Le truc avec le charset est qu'il soit cohérent tout au long de ta chaine de données.
 
Base de donnée, pages html, header html.


Message édité par kfman le 21-11-2004 à 19:23:42
Reply

Marsh Posté le 21-11-2004 à 19:26:17    

Mais le site est TOUT en UTF-8
Et en UTF-8, les accents... En plus je n'ai pas le jeu 8859-15...  
 
Il faudrais que je prenne le problème dans un autre sens :  
transformé les entité html en leur équivalent accentué pui les "désaccentué"....
Bien compliqué tout ça.


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 19:32:37    

Il y a une incohérence de charset quelque part, j'ai forcé le charset iso-8859-1 dans IE et la page s'affiche correctement.

Reply

Marsh Posté le 21-11-2004 à 19:37:02    

Je pense que je vais revoir ça de fond en comble mais dans le sens inverse le wk prochain.  
En tout cas, merci de votre aide.
 
Pour les charset, je suis en UTF-8 partout mais l'utf-8 n'interprete pas les accents...


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 20:07:34    

Voici ma nouvelle stratégie :  
- J'écris dans ma bd, les titres avec les entités html ;
- Je récupère mes titres ;
- Je convertit mes entités avec leur équivalent accentué ;
- Je transforme mes caratères accentés en leur équivalent non accentué ;
- Je transforme les espaces en _.
 
Facile à dire, j'attaqueeeeeeeeeee


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 21-11-2004 à 20:12:28    

Dans ta base n'écrit pas les entités html équivalentes aux caractères accentués, écrit tes caractères normalement.


Message édité par kfman le 21-11-2004 à 20:14:30
Reply

Marsh Posté le 21-11-2004 à 20:31:07    

Je fais le test avec ls entités normales, voici le contenu d'une partie de la table :  

Code :
  1. <id>4</id>
  2.         <titre>Á Â Ã Ä Å à á â ã ä å Ò Ó Ô Õ Ö Ø ò ó ô õ ö ø È É Ê Ë è é ê ë Ç ç Ì Í Î Ï ì í î ï Ù Ú Û Ü ù ú û ü ÿ Ñ ñ</titre>
  3.         <date>2004-11-21</date>
  4.         <contenu>ÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ</contenu>
  5.         <auteur>opgang</auteur>


Regardez le résultat sur http://www.eurotchat.info/indedx.php
La news avec tout les accents est horrible....
 
Et en utilisant :  

Code :
  1. $titre = $contenu[titre];
  2.   echo "ligne 11 : <b>$titre</b><br />";
  3.   $titre = strtolower($titre);
  4.   echo "ligne 12 : <b>$titre</b><br />";
  5.   $titre = removeaccents($titre);
  6.   echo "ligne 13 : <b>$titre</b><br />"; 
  7.   $titre = str_replace( array( ' ', '\t', '\r', '\n', '\'' ), '_', $titre );
  8.   echo "ligne 14 : <b>$titre</b><br />"; 
  9.   $titre = ereg_replace ("[^a-z0-9_]", "", $titre);
  10.   echo "ligne 15 : <b>$titre</b><br />";
  11.   $titre = ereg_replace ("_+", "_", $titre);
  12.   echo "ligne 16 : <b>$titre</b><br />";
  13.   $titre = ereg_replace ("(^_)|(_$)", "", $titre );
  14.   echo "ligne 17 : <b>$titre</b><br />";
  15.   echo "\t\t\t\t\t<h3><a href=\"news-$contenu[id]-"."$titre".".html\">$contenu[titre]</a></h3>\n";


Message édité par opgang le 21-11-2004 à 20:39:04

---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 22-11-2004 à 17:33:48    

Alors pas de nouvelles idées ?  
Peut-être mettre le site en iso-8859-2 à la place de UTF-8 ?


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 22-11-2004 à 18:47:50    

opgang a écrit :

Alors pas de nouvelles idées ?  
Peut-être mettre le site en iso-8859-2 à la place de UTF-8 ?


 
Dans ton code source tu remplaces

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>

par

Code :
  1. <?xml version="1.0" encoding="iso-8859-2"?>


 
Assure toi que ce n'est pas forcé par le serveur aussi.
Sinon quels sont tes charsets au niveau de la base, du code de tes pages (éditeur) ?


Message édité par kfman le 22-11-2004 à 18:50:18
Reply

Marsh Posté le 22-11-2004 à 19:11:50    

Nomalemnt je suis tout sous UTF-8 sous mon éditeur(PSPAD).
Je ne pense pas que le server force le charset car la page est bien valid avec UTF-8.
 Je vais tester ce wk avec iso-8859-2 pour voir ce que ça fait.


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 25-11-2004 à 18:35:58    

j'ai tout passé en iso, mais ça ahcnge pas grand chose....
j'ai ajouté ce-ci mais ça ne fonctionne pas :

Code :
  1. $titre = str_replace( array( 'é', 'è', 'à', 'ù', 'ç' ), array( 'e', 'e', 'a', 'u', 'c' ), $titre );


 
Une idée ?


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 25-11-2004 à 18:41:40    

opgang a écrit :


Une idée ?


 
oui  
 
 

Code :
  1. $titre=strtr($titre,'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ','AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');


 
 :hello:


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 25-11-2004 à 18:42:35    

L'accent dans l'url ? (ouverture du réseau)
En tout cas, tes caractères de pages sont affichés correctement...


Message édité par kfman le 25-11-2004 à 18:42:45
Reply

Marsh Posté le 25-11-2004 à 18:45:50    

simogeo a écrit :

oui  
 
 

Code :
  1. $titre=strtr($titre,'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ','AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn');


 
 :hello:


Justement, comme ça ne fonctionne pas avec ça j'ai éssayé avec array().  
 
Mais là, je me demande vraiment d'où viens le problème.....


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 25-11-2004 à 18:49:01    

opgang a écrit :

Justement, comme ça ne fonctionne pas avec ça j'ai éssayé avec array().  
 
Mais là, je me demande vraiment d'où viens le problème.....


 
oui mais non. Ce script fonctionne.
 
S'il y a encore des erreurs, leproblème vient de l'encodage de tes données !


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 25-11-2004 à 18:56:21    

j'y ai pensser, j'a passé tous le site en iso-8859-2 à la place de UTF-8 qui déconne avec les accents... Mais le résultat demeur le même...
 
Comment dénicher ce problème d'encodage ?


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 25-11-2004 à 19:03:53    

opgang a écrit :

j'y ai pensser, j'a passé tous le site en iso-8859-2 à la place de UTF-8 qui déconne avec les accents... Mais le résultat demeur le même...
 
Comment dénicher ce problème d'encodage ?


 
Le problème serait plutôt des données dans ta base de données. Tous les scripts donnés ici fonctionnent...


Message édité par pascal_ le 25-11-2004 à 19:04:14
Reply

Marsh Posté le 25-11-2004 à 19:08:14    

Et comment par exemple avec phpMyAdmin 2.6.0-pl2, s'assurer d'insérer des caractères sous iso-8859-2 ?
 
J'ai beau le trifouiller....


---------------
Allez viens :p http://www.eurotchat.info  
Reply

Marsh Posté le 25-11-2004 à 19:10:07    

Donne les valeurs de ces variables mysql:

character set client
character set connection
character set database
character set results
character set server
character set system
   
collation connection  
collation database
collation server


Message édité par kfman le 25-11-2004 à 19:11:09
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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