Partage
  • Partager sur Facebook
  • Partager sur Twitter

remplacer les caractères spéciaux dans une chaine

Sujet résolu
    7 mars 2010 à 22:49:42

    Bonsoir à tous
    J'ai un souci en js. Dans une de mes pages, je met une fonction sur l'évènement onload
    Cette fonction prend en paramètre une chaine de caractère (un nom de rue)
    Mon problème est que j'essaie d'exploiter cette chaine, les caractères spéciaux (avec accents) me posent problème.
    J'aimerai donc savoir comment je pourrai modifier les accents par les codes html qui correspondent ?

    j'ai essayé ce code sans succès (ma variable reste vide)
    var adresse="";
    for(var i =0 ; i < adresseDepart.length; i++)
    {
    	if(adresseDepart.charAt(i) == 'é')
    		adresse[i] = '&eacute';
    	else if(adresseDepart.charAt(i) == 'é')
    		adresse[i] = '&egrave';
    	else 
    		adresse[i] = adresseDepart.charAt(i);
    } 
    alert('adresse ' + adresse);
    
    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2010 à 22:59:34

      str = str.replace('é', '&eacute');
      

      Gné ? o_O
      • Partager sur Facebook
      • Partager sur Twitter
        8 mars 2010 à 9:02:57

        Il me semblait pourtant avoir essayé ça ...
        En tout cas, ça résous mon problème merci
        • Partager sur Facebook
        • Partager sur Twitter
          8 mars 2010 à 10:28:40

          Une autre solution, celle que j'utilise, c'est de remplacer la chaîne par son équivalant en ascii ;)
          • Partager sur Facebook
          • Partager sur Twitter
            8 mars 2010 à 17:27:28

            Ben, une tite fonction toute bête...

            <script type="text/javascript">
            function ENCODAGE_DES_DONNEES(parametres){
            	var i=0;
            	var resultat='&#';
            	while(parametres[i]){
            		resultat+=parametres.charCodeAt(i)+';';
            		i++;
            		parametres[i]?resultat+='&#':void(0);
            	}
            	return resultat;
            }
            </script>
            <a href="javascript:alert(ENCODAGE_DES_DONNEES('une chaîne avec des caractères spéciaux'))">test</a>
            
            • Partager sur Facebook
            • Partager sur Twitter
              8 mars 2010 à 17:51:59

              C'est quoi cette horreur o_O
              Pourquoi t'utilises pas onclick ?
              Et pourquoi un void 0 ?
              • Partager sur Facebook
              • Partager sur Twitter
                8 mars 2010 à 17:55:27

                J'utilise en effet généralement un onclick, j'ai tapé ça ainsi juste pour l'exemple.

                Le void(0), ben, parce qu'il n'y a rien à faire dans le cas contraire...
                • Partager sur Facebook
                • Partager sur Twitter
                  8 mars 2010 à 18:00:32

                  Euh lol ?
                  En quoi enlever le void gêne ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 mars 2010 à 18:10:21

                    Ben, je ne sais si c'est la meilleure façon de le faire

                    parametres[i]?resultat+='&#':void(0); // ne retourne pas d'erreur
                    parametres[i]?resultat+='&#':; // retourne une erreur de syntaxe
                    parametres[i]?resultat+='&#'; // retourne : manquant
                    




                    En fait, perso, ette fonction, je l'utilise en deux étapes, une qui convertit en ascii avant envoi vers le serveur.

                    Sur celui-ci, je vérifie uniquement que les données correspondent à la regex suivante: /^\d{2,3}(,\d{2,3})*$/

                    Puis je stocke dans ma bdd, aucun risque d'injection, pas besoin de regex complexes, d'htmlentites & Co, ...

                    Côté retour-client, je teste la même regex, ensuite j'emploie ma deuxième fonction qui m'ajoute les &# et ;

                    Je traite les balises autorisées et j'affiche le résultat.


                    Petite précision, je développe dans une optique de site web dont la page peut-être locale, par cette technique je protège autant le client que le serveur.

                    Même si le serveur se fait pirater, le client ne risque rien :magicien:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mars 2010 à 18:27:02

                      J'avais pas vu l'opérateur ternaire...
                      Mais pourquoi tu mets pas un simple if() ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2010 à 18:33:55

                        Ou simplement comme ça ? o_O

                        var resultat='';
                        	while(parametres[i]){
                        		resultat+= '&#'+parametres.charCodeAt(i)+';';
                        		i++;
                        	}
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 mars 2010 à 18:35:29

                          je suis du même avis que xavier
                          En plus il me semble qu'utiliser le if est plus rapide que d'utiliser la condition ? : (bon d'accord c'est vraiment des pouillièmes mais ça peut jouer sur de très grosses itérations)

                          sinon je trouve la fonction un peu lourde car elle convertit tous les caractères en utilisant le code ASCII (ça représente donc une chaine 5 à 6 fois plus grosse que l'originale). Éventuellement je préfère utiliser encodeURIComponent()


                          à Golmote:
                          var resultat='',i=-1;
                          	while(parametres[++i]){
                          		resultat+= '&#'+parametres.charCodeAt(i)+';';
                          	}
                          

                          si on cherche l'optim autant y aller au bout :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 mars 2010 à 18:43:47

                            Golmote> Grilled, comme tu dis ^^

                            restimel> faut que tu m'expliques, là, c'est un peu avancé pour moi, ta valeur de variable et ton ++i...

                            Sinon, d'accord, l'encodeURIComponent(), alourdit un peu moins la chaîne mais tu ne peux pas l'enregistrer ainsi dans la bdd, donc il faut la traiter à nouveau en php, bref, ça perd un peu de son sens niveau optimisation de ressources serveur...

                            Edit: Faire une regex sur une chaîne encodée en uri est tout de même plus complexe que sur un code ascii pour (peut-être 4/3 de longueur de chaine ascii/uri)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 mars 2010 à 18:56:43

                              Tiens c'est marrant restimel, moi j'aurais plutôt post-incrémenté (question de goût ?)

                              var resultat='',i=0;
                              while(parametres[i]){
                                resultat+= '&#'+parametres.charCodeAt(i++)+';';
                              }
                              


                              Ca me perturbe d'initialiser i à un indice d'élément inexistant :p
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 mars 2010 à 18:59:58

                                ++i est plus rapide en PHP.
                                En Js je sais pas :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 mars 2010 à 19:00:57

                                  le ++i c'est tu l'incrémentes d'abord puis tu retournes la valeur (contrairement au i++ où c'est tu retournes sa valeur puis tu l'incrémentes)
                                  le principe est de gagner une ligne (ce qui fait gagner du temps à l'interpréteur (d'accord c'est encore des pouillièmes)) en incluant l'incrément dans la vérification de l'existence du prochain caractère.

                                  On veut tout d'abord tester le 1er caractère (c'est à dire celui situé à l'indice 0). Comme on commence par incrémenter je suis obligé de démarrer un indice plus tôt donc à -1.
                                  Pourquoi ne pas mettre i++ à la place alors? simplement parce que à ta ligne suivante tu utilises i et si tu fais i++ dans le while tu auras tester la valeur 0 alors que tu utiliseras la valeur 1.

                                  Au moment où j'allais poster j'allais dire qu'il existait une autre solution qui est meilleur (elle fait gagner 1 incrément sur l'ensemble de la boucle) et je m'aperçoit que Golmote la posté. Donc pas besoin de la remettre.

                                  (en fait j'ai l'habitude de mettre ++i (ou i--) dans la boucle while par soucis de lisibilité (vu que la perte est extrêmement faible))



                                  Sinon j'ai lu après ton explication sur la protection d'injection donc effectivement ça peut être utile (même si j'ai un doute contre la protection des XSS)


                                  EDIT: arf ça n'arrête pas de poster... il me semble qu'en JS il n'y a pas de différence flagrante entre ++i et i++
                                  test de performance (i++ vs ++i)
                                  mettre 10000000 d'itérations (par checkpoint) pour avoir un temps significatif. Pour voir le résultat je préfère le mettre le résultat mode texte pour voir le détail (comme cette appli n'est pas complètement fini, il peut ya voir des bugs...)

                                  i++ a l'air légèrement plus rapide... (intéressant à savoir :D )
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 mars 2010 à 19:05:40

                                    Ca n'offre aucune protection contre les XSS.
                                    Par contre c'est vrai que si le serveur est corrompu, bah ça évite les merde... du moins depuis ce truc là... (en admettant que la page soit locale)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 mars 2010 à 19:22:17

                                      restimel> Merci pour cette explication :)

                                      Les XSS, si j'en ai bien compris le principe, ben, perso, ça ne me concerne pas du tout, à l'identification, j'envoie à la page un paramètre contenu dans celle-ci, à ce paramètre correspond une variable stockée sur le serveur qui elle-même est un index de session sans lequel le pseudo de l'utilisateur n'est pas récupéré et comparé au pseudo renvoyé par le client et le tout est bien évidemment aléatoire.

                                      Injection par un site extérieur? il faut la session, la variable et le pseudo correspondant.

                                      Vol de session? sans le paramètre et pseudo -> ne sert à rien, rien n'est posté.

                                      De plus, on peut même ajouter une durée de vie à la variable, par exemple, je m'en sers sur mon chat, avec un rafraichissement auto/seconde, ça devient vraiment chaud.

                                      Un peu lourd? ben, c'est pour ça que je récupère des ressources sur le reste ^^

                                      Donc en dopant la sécurité côté client, ça permet de pouvoir davantage sécuriser côté serveur, que demander de mieux? ne pas avoir de pirates pour ne pas avoir à sécuriser?

                                      Manque plus qu'un petit coup de ssl par-dessus et c'est nickel.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      remplacer les caractères spéciaux dans une chaine

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown