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

Langage PHP Discussion :

[Système] trouver et séparer une chaine de caractère trop longue


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut [Système] trouver et séparer une chaine de caractère trop longue
    Bonjour,

    Je suis en train de filtrer les champs de mon système de commentaire. Entre autre je veux éviter qu'un petit génie ne vienne massacrer ma mise en page en balançant à l'intérieur de son texte un "mot" du genre : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    Cela ne ferait pas bel effet à certains endroit de mon site.

    Alors mon petit problème est que je ne sais pas comment détecter un mot de ce genre à l'intérieur d'un texte complet (le mot pouvant être une url).

    Exemple :
    Le petit chaperon rouge est un grosssssssssssssssssssssssssssssssssssssssssssssss futé.

    Le but dans cette phrase est de couper (et non tronquer) le mot grossssssssssssssssssssssssssssssssssssssssssssss tout en conservant la suite du texte, soit "futé" dans notre exemple.


    j'ai essayé les fonction wordwrap, strrpos etc... mais elles ne conviennent pas.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Salut,

    C'est tout simple, voila le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function eclate($texte) {
    $texte=chunk_split($texte,30," ");
    return $texte;
    }
    Si un mot (une suite de caractère ne contenant aucun espace ou saut de ligne, retour chariot etc) dépasse 30 caractères dans la chaine $texte, j'ajoute un espace tous les 30 caractères.

    Tu peux donc changer le nombre et choisir le caractère (ou la chaine) à ajouter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Merci pour ta réponse

    Alors, je viens d'essayer, ça coupe la chaine trop longue mais le problème c'est que j'utilise nl2br() dans mon système de commentaire et maintenant au lieu d'un retour à la ligne, s'affiche le <br/>

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Hoy,

    Erreur classique, tu as inversé nl2br() et htmlentities() ou htmlspecialchars()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $texte = "mot \n autre mot";
    $texte = nl2br($texte);
    $texte = htmlentities($texte);
    $texte est maintenant égal à "mot <nr /> autre mot"

    Il faut l'écrire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function eclate($texte) {
    $texte = chunk_split($texte,30," ");
    $texte = htmlentities($texte);
    $texte = nl2br($texte);
    return $texte;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    ça a l'air de fonctionner d'une manière impeccable, merci à toi Vell !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Non en fait mes tests étaient incomplet, ça ne fonctionne pas vraiment : la coupure est intempestive et intervient même dans les mots qui ne font pas la taille de la limite fixée.

    Le but est de couper les mots qui dépassent la limite de caractère N, mais pas tous les mots tous les N caractères.

  7. #7
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Salut, tu peux essayer ça (je n'ai pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $longueur = 10;
    $caractere = ' '; // Ce que tu utilises pour séparer le mot
    $texte = preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU','$1'.$caractere,$texte);
    Bon développement

  8. #8
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $mots = explode(' ', $texte);
    for($i=0;$i<count($mots);$i++) {
       if (strlen($mot[$i]) > 30) {
          $start_mot = substr($mot[$i], 0, 30);
          $end_mot = substr($mot[$i], 30, strlen($mot[$i]));
          $new_mot = $start_mot.' '.$end_mot;
          str_replace($mot[$i], $new_mot, $texte);
       }
    }
    Euh à tester aussi.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Merci Anduriel,

    Alors je viens d'essayer la deuxième solution, n'ayant pas compris à première vue le sens des premiers éléments du preg_replace dans ta première solution.

    Alors pour la première solution, ça n'est pas si mal :

    les mots trop long sont tronqués, ce qui déjà supprime le risque de voir la mise en page cassée.

    Par contre ils ne sont pas seulement coupés en deux à la limite fixée, mais carrément tronqués, la suite du mot disparaissant. Ce qui peut être embêtant pour les urls.

  10. #10
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Salut, j'ai testé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $texte = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
    $longueur = 10; 
    $caractere = ' '; // Ce que tu utilises pour séparer le mot 
    $texte = preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU','$1'.$caractere,$texte);
    echo $texte;
    ?>
    Le résultat à l'affichage
    aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaa

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    Impeccable, merci beaucoup à vous deux !

    Mon code complet donne cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      $nombreMots = explode(' ', $contenuC);
    for($i=0;$i<count($nombreMots);$i++) {
       if (strlen($nombreMots[$i]) > 30) {
    $longueur = 30;
    $caractere = ' '; // Ce que tu utilises pour séparer le mot
    $contenuC = preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU','$1'.$caractere,$contenuC);
       }
    }
    Mais je voudrais bien comprendre la ligne preg_replace (pas la fonction en elle même je la connais) :
    Pourriez vous m'aider à traduire en Français la ligne suivante (mot à mot si ce n'est point trop demandé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ([[:alnum:][:punct:]]{'.$longueur.'})`smU','$1'.$caractere,$contenuC
    Histoire de ne pas utiliser une fonction sans la comprendre, c'est un peu dommage...

  12. #12
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Pour les expressions régulières, tu peux aller ici : http://cyberzoide.developpez.com/php4/regex/
    C'est très bien expliqué et tous les éléments que tu utilises y sont décrits

    N'oublie pas de cliquer sur en bas à gauche de la page

    EDIT : pour ton script, tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $longueur = 30; 
    $caractere = ' '; // Ce que tu utilises pour séparer le mot 
    $contenuC = preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU','$1'.$caractere,$contenuC);

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    ça roule merci pour le lien

    **edit** je viens de lire le PPT effectivement ça doit pouvoir être très utile.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Ah, me serais trompé de morceau de code...

    Pour les regex, mieux vaut les éviter (pour des raisons de performances), mais si tu ne peux pas faire autrement essayes de voir du coté de preg_split() qui serait peut-être plus adapté et donnerait un code moins lourd.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Points : 472
    Points
    472
    Par défaut
    tu arrives trop tard, la fonction preg_split m'a l'air super, mais là j'ai pas le courage de tout refaire vu que ça fonctionne...

    Tu crois qu'elle fonctionnerait pour un tableau qui récapitule des grossieretés à supprimer?

    Là je fais ça :

    $interdit=array(
    '#\bmot1\b#i',
    '#\bmot2\b#i',
    '#\bmot3\b#i',
    )
    et le script qui va avec.

    Tu penses que l'on peut remplacer ça avec preg_split?

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    En fait non, preg_split n'est pas à conseiller. J'ai parler trop vite, ayant une idée en tête. Maintenant que je n'ai plus mon idée et que je retourne voir la fonction, son application me paraît même difficile pour ton exemple...

    Je crois que je commence à fatiguer ces derniers jours

    Excuses moi de t'avoir fait perdre un peu de ton temps...

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

Discussions similaires

  1. Séparer une chaine de caractères sans split
    Par ndsaerith dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 24/05/2011, 16h05
  2. [Débutant] séparer une chaine de caractères
    Par mygwel dans le forum MATLAB
    Réponses: 16
    Dernier message: 27/03/2009, 18h51
  3. [MySQL] Séparer une chaine de caractères dans ma table
    Par keokaz dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 02/11/2008, 19h39
  4. [BO XI R2] Séparer une chaine de caractère
    Par perrine1985 dans le forum Deski
    Réponses: 2
    Dernier message: 16/04/2008, 10h01
  5. Séparer une chaine de caractère
    Par fabienschmitt dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 08/11/2006, 14h57

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