IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Fonction remplacer les caractères accentués


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut Fonction remplacer les caractères accentués
    Bonjour

    J'ai fait une fonction qui remplace les accents par des caractères sans accents, seulement voilà, certains accents ne sont pas remplacés, notamment quand il y a plusieurs fois le même caractère, et le premier ainsi que le dernier ne sont pas remplacés non plus.

    Mon appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    // Pour tester, j'ai fait une chaine remplie d'accents, certains y étant plusieurs fois
    chaine = 'ýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçËÌÜÝÞÍèéêëìíîïðñòóôõöøùúûüýëîïðËÌÍ';
    chaine = no_accent(chaine);
    alert(chaine);
    ?>
    Ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
     
    function no_accent(my_string) 
    	{
    		// tableau accents
    		var pattern_accent = new Array("À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë",
    		"Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","Ø","Ù","Ú","Û","Ü","Ý",
    		"Þ","ß","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î",
    		"ï","ð","ñ","ò","ó","ô","õ","ö","ø","ù","ú","û","ü","ý","ý","þ","ÿ");
     
    		// tableau sans accents
    		var pattern_replace_accent = new Array("A","A","A","A","A","A","A","C","E","E","E","E",
    		"I","I","I","I","D","N","O","O","O","O","O","O","U","U","U","U","Y",
    		"b","s","a","a","a","a","a","a","a","c","e","e","e","e","i","i","i",
    		"i","d","n","o","o","o","o","o","o","u","u","u","u","y","y","b","y");
     
    		//pour chaque caractere si accentué le remplacer par un non accentué
    		for(var i=0;i<pattern_accent.length;i++)
    		{
    			// si on trouve un accent dans la chaine on le remplace par le caractere non accentué correspondant
     
    			if( my_string.indexOf(pattern_accent[i]) )
    			{
    				my_string = my_string.replace(pattern_accent[i],pattern_replace_accent[i]);
    			}
    		}
    		return my_string;
    	}
    Ce que ça me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ýbyAAAAAAACEEEEIIIIDNOOOOOOUUUUYbsaaaaaaacËÌÜÝÞÍeeeeiiiidnoooooouuuuýëîïðËÌÍ
    Comment puis-je faire pour gérer le fait que le caractère puisse être plusieurs fois dans la chaîne, et que les premier et dernier caractères soient remplacés aussi ?

    Cordialement
    Ginger

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    regexp => plusieurs posts traitent déja de ce sujet ..

    Une première manière de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var TabSpec = {"à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","è":"e","é":"e","ê":"e","ë":"e","ç":"c","ì":"i","í":"i","î":"i","ï":"i","ù":"u","ú":"u","û":"u","ü":"u","ÿ":"y","ñ":"n","-":" ","_":" "}; 
     
    function replaceSpec(Texte){
    	var reg=/[àáäâèéêëçìíîïòóôõöøùúûüÿñ_-]/gi; 
    	return Texte.replace(reg,function(){ return TabSpec[arguments[0].toLowerCase()];}).toLowerCase();
     	}
     
    var TestTexte="àAAÀAAÁÂÒÓÔÕÖØòÒÓÔÕ-ÖØòó_ôõöøÈÉÊËèéêëÇçÒÓÔÕÖØòÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
    alert(replaceSpec(TestTexte))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Autre manière un peu plus sophistiquée mais plus facilement maintenable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    var rules = {
    			a:"àáâãäå",
    			A:"ÀÁÂ",
    			e:"èéêë",
    			E:"ÈÉÊË",
    			i:"ìíîï",
    			I:"ÌÍÎÏ",
    			o:"òóôõöø",
    			O:"ÒÓÔÕÖØ",
    			u:"ùúûü",
    			U:"ÙÚÛÜ",
    			y:"ÿ",
    			c: "ç",
    			C:"Ç",
    			n:"ñ",
    			N:"Ñ"
    			}; 
     
     function  getJSONKey(key){
     for (acc in rules){
     if (rules[acc].indexOf(key)>-1){return acc}
     }
     }
     
    function replaceSpec(Texte){
    regstring=""
    for (acc in rules){
     regstring+=rules[acc]
     }
    reg=new RegExp("["+regstring+"]","g" )
    		return Texte.replace(reg,function(t){ return getJSONKey(t) });
     	}
     
    var TestTexte="àAAÀAAÁÂÒÓÔÕÖØòÒÓÔÕ-ÖØòó_ôõöøÈÉÊËèéêëÇçÒÓÔÕÖØòÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
    alert(replaceSpec(TestTexte))
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    ó_ô
    Ton code s'est éveillé à la conscience !

    Skynet ! fuyez !

    edit : j'avais pas vu celui avec les lunettes............ dis tout de suite que tu te moques de mon avatar ! ()

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut

    non il sort de chez l'occuliste !
    Õ-Ö
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 107
    Points : 65
    Points
    65
    Par défaut
    Aha ! Attention il va se fâcher ÒÓ

    Merci pour vos réponses !!

    Entre temps j'ai trouvé cette solution qui fonctionne du tonnerre, en mettant une regex sur chaque élément du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    function no_accent(my_string)
    {
    // tableau accents
    		var pattern_accent = new Array(/À/g, /Á/g, /Â/g, /Ã/g, /Ä/g, /Å/g, /Æ/g, /Ç/g, /È/g, /É/g, /Ê/g, /Ë/g,
    		/Ì/g, /Í/g, /Î/g, /Ï/g, /Ð/g, /Ñ/g, /Ò/g, /Ó/g, /Ô/g, /Õ/g, /Ö/g, /Ø/g, /Ù/g, /Ú/g, /Û/g, /Ü/g, /Ý/g,
    		/Þ/g, /ß/g, /à/g, /á/g, /â/g, /ã/g, /ä/g, /å/g, /æ/g, /ç/g, /è/g, /é/g, /ê/g, /ë/g, /ì/g, /í/g, /î/g,
    		/ï/g, /ð/g, /ñ/g, /ò/g, /ó/g, /ô/g, /õ/g, /ö/g, /ø/g, /ù/g, /ú/g, /û/g, /ü/g, /ý/g, /ý/g, /þ/g, /ÿ/g);
     
    		// tableau sans accents
    		var pattern_replace_accent = new Array("A","A","A","A","A","A","A","C","E","E","E","E",
    		"I","I","I","I","D","N","O","O","O","O","O","O","U","U","U","U","Y",
    		"b","s","a","a","a","a","a","a","a","c","e","e","e","e","i","i","i",
    		"i","d","n","o","o","o","o","o","o","u","u","u","u","y","y","b","y");
     
    		//pour chaque caractere si accentué le remplacer par un non accentué
    		for(var i=0;i<pattern_accent.length;i++)
    		{
    			my_string = my_string.replace(pattern_accent[i],pattern_replace_accent[i]);
    		}
    		return my_string;
    }
    Merci encore !

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Tu remarqueras que la solution des rules diminue de façon considérable le nombre de regexp... je n'ai ai qu'une !
    Ta solution est très gourmande !
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Tu remarqueras que la solution des rules diminue de façon considérable le nombre de regexp... je n'ai ai qu'une !
    Ta solution est très gourmande !
    +1

    >>> que ce soit pour la performance ou la maintenabilité / lisibilité, je préfère la solution SF ^^

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  9. #9
    Membre du Club

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Points : 48
    Points
    48
    Par défaut Autre solution via RegExp unique
    Cette fonction, assez proche de celle de SpaceFrog, est particulièrement efficace (utilisation pour comparaison avec une liste comportant plusieurs centaines de noms).
    Elle présente la particularité de fonctionner aussi avec les æ et œ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var dicLetAcc = {
      à:'a',â:'a',ä:'a',æ:'ae',ç:'c',é:'e',è:'e',ê:'e',ë:'e',î:'i',ï:'i',ô:'o',ö:'o',œ:'oe',ù:'u',û:'u',ü:'u',
      À:'A',Â:'A',Ä:'A',Æ:'AE',Ç:'C',É:'E',È:'E',Ê:'E',Ë:'E',Î:'I',Ï:'I',Ô:'O',Ö:'O',Œ:'OE',Ù:'U',Û:'U',Ü:'U'};
    var lstCar = Object.keys(dicLetAcc).join('');
    var reSansAcc = new RegExp("[" + lstCar + "]", "g");
     
    var TestTexte="À l'arrêté, une flêche à l'œil d'Ædès... limité aux diacritiques du français :"
    alert(sansAccent(TestTexte) + '\n\n' + lstCar + '\n=> ' + sansAccent(lstCar))
     
    function sansAccent(txt) {
      return txt.replace(reSansAcc, function(t){return dicLetAcc[txt]});
    }
    Il vous faudra ajouter les autres lettres accentuées si nécessaire... (complétez la première ligne, puis dupliquez-la et convertissez la deuxième ligne tout en majuscule).

    Vous pouvez également utiliser l'expression régulière pour tester si une expression nécessite une conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (txt.match(reSansAcc)) ....
    Variante à peine plus complexe avec une seule liste à maintenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    var dicLetAcc = {
      à:'a',â:'a',ä:'a',æ:'ae',ç:'c',é:'e',è:'e',ê:'e',ë:'e',î:'i',ï:'i',ô:'o',ö:'o',œ:'oe',ù:'u',û:'u',ü:'u'
    };
    var lstCar = Object.keys(dicLetAcc).join('');
    var reSansAcc = new RegExp("[" + lstCar + "]", "gi");
     
    var TestTexte="À l'arrêté, une flêche à l'œil d'Ædès... limité aux diacritiques du français :"
    lstCar += lstCar.toUpperCase();
    alert(sansAccent(TestTexte) + '\n\n' + lstCar + '\n=> ' + sansAccent(lstCar))
     
    function sansAccent(txt) {
      return txt.replace(reSansAcc, 
        function(t) { 
          return (t.toUpperCase() == t) ? dicLetAcc[t.toLowerCase()].toUpperCase() : dicLetAcc[t];
        }); // Les caractères majuscules sont transformés en minuscules avant conversion puis remis en majuscules
    }

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Puisque déterrage il y a:

    Avec ECMAScript 6, il est facile de supprimer les accents en effectuant une normalisation NFKD, qui par exemple va transformer le caractère "à" (U+00E0 LATIN SMALL LETTER A WITH GRAVE) en "a" (U+0061 LATIN SMALL LETTER A) suivi du caractère combinant "`" (U+0300 COMBINING GRAVE ACCENT), puis en supprimant les caractères combinants.
    Une chance, ces caractères combinants sont répartis sur trois plages précises de la table unicode:
    • U+0300..U+036F: Combining Diacritical Marks
    • U+1DC0..U+1DFF: Combining Diacritical Marks Supplement
    • U+1AB0..U+1AFF: Combining Diacritical Marks Extended


    Donc pour se débarrasser des accents, il suffit d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var chaine = 'ýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçËÌÜÝÞÍèéêëìíîïðñòóôõöøùúûüýëîïðËÌÍ';
    var result = chaine.normalize('NFKD').replace(/[\u0300-\u036F\u1DC0-\u1DFF\u1AB0-\u1AFF]+/g, '');
    // 'yþyAAAAAAÆCEEEEIIIIÐNOOOOOØUUUUYÞßaaaaaaæcEIUYÞIeeeeiiiiðnooooouuuuyeiiðEII'
    Tous les accents ont disparu. Seuls restent quelques caractères non-accentués n'appartenant pas à la table ASCII; ce qui est l'occasion de se demander s'il est pertinent de transformer un Ø en O au risque d'intriguer le camerounais ou de surprendre le danois (à vous de voir).

    Quoi qu'il en soit, pour poursuivre la translittération, on peut procéder comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var rules = { 'þ': 'th', 'Þ': 'TH', 'Æ': 'AE', 'æ': 'ae', 'Ð': 'TH', 'ð': 'th', 'Ø': 'EU', 'ø': 'eu', 'ß': 'ss' };
    result = result.replace(/[þÞÆæÐðØøß]/g, m => rules[m[0]]);
    // 'ythyAAAAAAAECEEEEIIIITHNOOOOOEUUUUUYTHssaaaaaaaecEIUYTHIeeeeiiiithnoooooeuuuuuyeiithEII'
    À noter, String.prototype.normalize() n'est pas supporté par Internet Explorer (mais l'est par Edge), donc n'hésitez pas à l'utiliser pour le pousser dans la tombe.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/03/2011, 12h20
  2. [RegEx] remplacer tous les caractères accentués d'une chaine
    Par Alexdezark dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2009, 12h47
  3. Réponses: 3
    Dernier message: 25/02/2009, 15h59
  4. les caractères accentués sont remplacés par des caractères chinois
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/12/2008, 22h33
  5. Remplacer les caractères accentués dans une chaine
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 5
    Dernier message: 07/05/2008, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo