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 :

Réécriture champ texte pour mise en forme url [RegExp]


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Réécriture champ texte pour mise en forme url
    Bonjour à tous,

    C'est vraiment en cas d'extrême limite que je me résous à poster dans un forum, la plupart du temps en parcourant internet je trouve les réponse à mes questions. Mais là, non, je sais pas pourquoi

    Trève de blabla, voici mon problème :

    J'ai un formulaire, tout bête, avec entre autre deux champs texte, tout bête eux aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <input type="text" name="title" id="title" value="" maxlength="64" />
    <input type="text" name="url" id="url" value="" maxlength="16" />
    Ce que j'aimerai faire :

    Lorsque j'écris par exemple "J'adore les patates " dans le champs title, le champs url se remplisse automatiquement de la forme : "j-adore-les-patates". Ca ressemble à du URL rewriting, c'est normal L'URL sera ensuite stockée dans ma base, puis resservie sous la forme index.php?post=j-adore-les-patates puis, à coup de htaccess, en /j-adore-les-patates.html.

    J'ai essayé de nombreux pattern et fonctions en Javascript (j'utilise jQuery), avec quelque chose qui ressemble à ça et qui fonctionne relativement bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $("#title").keyup(function () {
        var value = $(this).val();
        $("#url").val(value.replace(/[' ]/g, patternURL).toLowerCase());
    }).keyup();
     
    function patternURL(car) {
      if(car == "'" || car == " ") return "-";
      if(car == "ç") return "c";
      if(car == "é" || car == "è" || car == "ê") return "e";
      if(car == "à" || car == "â") return "a";
      if(car == "ù" || car == "û") return "u";
      if(car == "ô") return "o"; */
    }
    La fonction est absolument horrible mais définie bien ce que je veux faire :
    • Remplacer les caractères accentués par des non accentués
    • Remplacer les caractères spéciaux par un tiret

    Mais je ne veux pas, en cas de titre "Hey ! Beignet !" un truc genre "Hey------Beignet--" mais bien "hey-beignet".

    Voila, j'espère avoir été assez clair, je continue à chercher de mon côté.

    A très vite, et surtout, merci !!

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Pour simplifier, à ta place je procèderais en deux étapes :
    * remplacement des caractères accentués et autres (en faisant une recherche, il y a eu récemment diverses solutions de données à ce sujet) ;
    * remplacement de tout les caractères indésirés restant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var value = $(this).val();
    value = value.replace(/[\W+]/g, '-');
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var value = $(this).val();
    value = value.replace(/[\W+]/g, '-');
    Je ne connaissais pas cette regexp, je te remercie vivement !! Plus qu'à trouver comment supprimer le trop-plein de tirets et ce sera parfait...

    Encore merci à toi !

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Normalement, ça le fait déjà
    \W correspond à tout caractère non alphanumérique (donc autre que [a-z0-9]) et le + indique que ce caractère peut être présent plusieurs fois de suite.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var value = $(this).val();
    value = value.replace(/[\W+]/g, '-');
    Citation Envoyé par Bovino Voir le message
    Normalement, ça le fait déjà
    \W correspond à tout caractère non alphanumérique (donc autre que [a-z0-9]) et le + indique que ce caractère peut être présent plusieurs fois de suite.
    Pas tout à fait non...

    Ecrite comme ça oui : /\W+/g.
    Ecrite comme ça /[\W+]/g par contre elle sélectionne le premier caractère non alpha-numérique ou le premier caractère "+" et ceci de façon globale dans la chaine.

    C'est donc cette regex là qu'il faut utiliser : /\W+/g.

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut


    C'est vrai que j'ai un peu dérapé sur le coup !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Effectivement, ta regex Loceka est vraiment bien. J'aurai dû lire les docs sur le sujet, j'avoue que j'ai un peu mer... bâclé l'affaire, mais vous savez ce que c'est je suppose, à force de se prendre la tête, tout s'embrouille.

    Donc, j'arrive à remplacer (plutôt : supprimer) les caractères non alphanumériques. C'est déjà pas mal, mais en appliquant une fonction avant ce replace, peut-être arriverai-je à modifier les caractères accentués en non accentués. Justement, je n'arrive pas à trouver de regex facilitant la chose. J'ai bien une idée, du genre :
    1. Trouver les caractères accentués
    2. Les remplacer par leur équivalent non accentué


    Je continue à potasser le problème, et vous tiens au jus.

    Et encore merci à vous !

    Edit :

    Je pense avoir trouvé une idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $("#title").keyup(function () {
      var value = $(this).val();
      // 1
      value = value.toLowerCase();
     
      // 2
      value = value.replace(/[àáâãäå]/g,"a").replace(/[èéêë]/g,"e").replace(/[ìíîï]/g,"i").replace(/[ðòóôõö]/g,"o").replace(/[ùúûü]/g,"u").replace(/[ýÿ]/g,"y").replace(/[ç]/g,"c");
     
      //3
      value = value.replace(/\W+/g, '-')
      $("#url").val(value);
    }).keyup();
    Ainsi :
    1. Tous les caractères en minuscule
    2. Remplacement des accents
    3. Remplacement des caractères non alphanumériques


    Par exemple : Hé, c'est un beignet ! -> he-c-est-un-beignet-

    Plus qu'à supprimer le tiret de fin (faciiile !).
    Par contre, j'aimerai modifier l'étape 2, vraiment trop moche...

    Merci à vous, again

  8. #8
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Comme l'a dit Bovino, il y'a plein de posts sur le forum Javascript de dvp qui parle de cette substitution de caractères accentués.

    Mais de mémoire tous se résument à la même chose : prendre dans la table ascii chaque caractère accentué et faire la substitution à la main avec le caractère qui va bien.
    Il n'y a pas de fonction toute faite pour ça.

  9. #9
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Citation Envoyé par Loceka Voir le message
    prendre dans la table ascii chaque caractère accentué et faire la substitution à la main avec le caractère qui va bien.
    J'imagine que c'est même mieux, il n'y a pas de problèmes avec ma technique vis-à-vis de l'encodage de caractères ? Je ne pense pas, mais je préfère être sûr. C'est-à-dire : ma page et mes données SQL sont encodées en utf-8, tout va bien de ce côté-là, mais est-ce que le client peut avoir un navigateur qui envoie des POST dans un autre encodage ?

  10. #10
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Pour les accents, je ressors ceci. On s'était bien éclatés ce jour-là

    Pour l'encodage, maintenant que tu le dis, j'ai un petit doute. A priori, tu as déjà tout réglé en UTF8 donc tu ne devrais pas avoir de problèmes. Mais là, je me pose la question : que se passe-t-il si l'utilisateur change volontairement la détection d'encodage de son navigateur ?
    Je vais faire des tests.

    Edit: voir plus bas.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  11. #11
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    J'attends tes résultats avec impatience

  12. #12
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    C'est évident en fait, j'avais oublié (fin bon, ça m'a permis de faire mumuse avec Wireshark ^^)
    Les données de formulaires sont transmises dans le format application/x-www-form-urlencoded qui repose sur l'ASCII simple. Tous les caractères « sensibles » sont convertis en %xx, par exemple %20 pour l'espace. (En réalité il s'agit du code ASCII en hexa, et on peut l'obtenir avec encodeURIComponent.)
    Conclusion : si le charset de la page est bien déclaré, aucun problème avec le formulaire !
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  13. #13
    Membre averti
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Eh oui, maintenant que tu le dis, c'est bien ça... Aucun problème d'encodage, c'est parfait, je suis bien content.

    Histoire de terminer, au cas où ça peut intéresser d'éventuels développeurs, le code que j'ai trouvé et qui marche pas trop mal :
    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
    // Fonction de création de l'URL en live
    // Si vous avez des idées d'améliorations, n'hésitez pas :)
    	$("#title").bind("keyup", function() {
    		var title = $(this).val(); // Récupération titre
    		var url = title;
    		url = url.toLowerCase(); // URL en minuscule
    		url = url.replace(/[àáâãäå]/g,"a").replace(/[èéêë]/g,"e").replace(/[ìíîï]/g,"i").replace(/[ðòóôõö]/g,"o").replace(/[ùúûü]/g,"u").replace(/[ýÿ]/g,"y").replace(/[ç]/g,"c").replace(/\W+/g, '-'); // Remplace accents par non accentués, et caractères non alphanumeriques par tiret
    		var posLastTiret = url.lastIndexOf("-", url.length-1); // position dernier tiret
    		// Si dernier caractère est tiret, on supprime
    		// Cas rencontré si titre termine par caractère non alphanumérique, tiret remplaçant espace
    		// Exemple : "Ma chaine !"
    		if(url.length == posLastTiret+1) {
    			url = url.substring(0, posLastTiret);
    		}
    		// Si longueur url > 32, on coupe au dernier mot entier
    		if(url.length > 32) {
    			var urlSplit = url.split("-");
    			var nb_mots = urlSplit.length;
    			url = url.substring(0, nb_mots);
    			return false;
    		}
    		// Affiche dans champs url
    		$("#url").val(url);
    		return false;
    	});
    Je compte bien essayer de faire un plugin pour cette histoire d'accents, mais c'est surtout histoire de m'amuser à... créer un plugin jqUery (pour une fois que j'ai l'occasion !)

    En tous cas, merci à vous tous pour vos précieux conseils !
    See you later

  14. #14
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Compare simplement le dernier caractère de url au lieu d'utiliser lastIndexOf. Sinon, si ta chaîne ne contient pas de tiret, elle sera parcourue en entier pour rien…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ('-' == url[url.length - 1]) {
    	url = url.substring(0, url.length - 1);
    }
    Ou, si on est vraiment pointilleux, on met url.length - 1 dans une variable pour éviter que le même calcul soit fait deux fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var n = url.length - 1;
    if ('-' == url[n]) {
    	url = url.substring(0, n);
    }
    C'est la solution la plus efficace. Mais si tu recherches plutôt la concision, les regexp te proposent au moins deux autres solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url = url. … .replace(/[ç]/g,"c").replace(/\W+$/g, '').replace(/\W+/g, '-');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url = url. … .replace(/[ç]/g,"c").replace(/\W+/g, '-').replace(/-$/, '');
    (je pense que la seconde est un poil moins efficace).
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

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

Discussions similaires

  1. Package Ada pour mise en forme d'écran/console
    Par Hibou57 dans le forum Ada
    Réponses: 12
    Dernier message: 07/02/2015, 17h14
  2. Erreur sur champ text pour un index Full-Text
    Par Steph82 dans le forum Outils
    Réponses: 5
    Dernier message: 06/01/2011, 14h08
  3. texte et mise en forme
    Par sandytarit dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/02/2007, 19h20
  4. Widget Text et mise en forme des sélections
    Par Chris33 dans le forum Tkinter
    Réponses: 1
    Dernier message: 20/09/2006, 09h10
  5. [CSS] Besoin d'aide pour mise en forme !
    Par TorF dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 19/03/2005, 19h28

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