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 :

Tronquer une chaine de caractère sauf si c'est une URL.


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 Tronquer une chaine de caractère sauf si c'est une URL.
    Bonjour,

    J'ai un petit souci : Je dois tronquer les chaines de caractères qui s'affichent sur la page, si celles-ci dépassent 26 caractères.
    Pour ce faire, à la réception d'un formulaire, je tronque le contenu à l'aide de la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $longueur = 26;
    $caractere = ' '; 
    $contenu= preg_replace('`([[:alnum:][:punct:]]{'.$longueur.'})`smU',
    '$1'.$caractere,$contenu);
    Cela fonctionne bien. Mais le problème c'est que je peux recevoir des URL via le form, et elles doivent fonctionner convenablement, donc ne pas être tronquées.
    Je dois donc excepter de la fonction ci-dessus les urls. A priori il faudrait détecter celle-ci via <a href></a>.

    Voyez-vous comment faire ?
    C'est pas parce que j'ai tort que vous avez raison.

  2. #2
    Membre actif Avatar de riesseg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 415
    Points : 251
    Points
    251
    Par défaut
    tu test les premiers caracteres et si ils sont egales a http:// ou a www tu ne fais pas ta troncature
    n'oubliez pas la balise

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Tu pourrais tester avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eregi("http:\/\/www\..([a-z]+\.[a-z]{3}",$chaine,$split)
    Si ca passe pas dis le moi lol, on fera avec preg_match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split)

  4. #4
    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
    Oui alors je réfléchi à ce que vous me dites là. Par contre je me suis mal expliqué :

    Si le gars me fait un copier/coller d'une url, je m'en fiche de la tronquer de toute façon elles ne réagissement pas aux clics à l'affichage.

    Par contre sur mon éditeur de texte made in taïwan j'ai un bouton qui crée des liens avec libellé. Donc il apparait sur l'écran du visiteur un lien google et le <a href="http://www.google.fr"></a> ne se voit pas, c'est dans le code.
    C'est ce <a href="......"> que je ne veux pas découper avant l'envoit dans la base.

    **edit**
    A priori y'a deux solutions : soit je détecte dans le contenu les <a href> et je les tronque pas.
    Soit je les recolle après qu'elles aient été tronquées.
    Reste à écrire la chose quoi...
    C'est pas parce que j'ai tort que vous avez raison.

  5. #5
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben dans l'expression régulière que je t'ai donné tu rajoutes juste le href et ca devrait etre bon, non ?

  6. #6
    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
    Sinon j'utiliserait preg_replace_callback() à ta place (je l'aime bien celui là).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function test_string($results) {
       if (substr($results[0], 0, 2) == "<a")
          return $results[0] // si c'est un lien on remplace par la même chose
       else
          return $results[0].$caractere; // sinon espace
    }
     
    $longueur = 26;
    $caractere = ' '; 
    $chaine = preg_replace_callback('`([[:alnum:][:punct:]]{'.$longueur.'})`smU', "test_string", $chaine);
    Je trouve ça un peu trivial par contre non ?
    Mais je me demand si c'est bien ça que tu veux ?
    Edit: Mmm mon code ne doit pas fonctionner dans tous les cas... Est ce que tu pourrais même un exemple de chaine que tu récupères?

  7. #7
    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
    Ben dans l'expression régulière que je t'ai donné tu rajoutes juste le href et ca devrait etre bon, non ?
    Oui mais là je la pige pas ton expression régulière Kerod.

    Citation Envoyé par Kerod
    Tu pourrais tester avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eregi("http:\/\/www\..([a-z]+\.[a-z]{3}",$chaine,$split)
    Si ca passe pas dis le moi lol, on fera avec preg_match :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split)
    En fait je dois faire ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(preg_match("#< href="http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split))
    {qu'est ce que je marque dans l'instruction ? ;}
    J'arrive pas à traduire en Français cette ligne en fait.

    Sinon j'utiliserait preg_replace_callback() à ta place (je l'aime bien celui là).
    Avec plaisir si les autres confirment son utilité, parce que vu comment elle me parle cette fonction je préfère pas trop m'y frotter...

    Un truc plus simple peut être :

    Comment supprimer les espaces dans une chaine qui commence par <a href et termine par > ?

    Pas de if ni rien là dedans, je devrais comprendre
    C'est pas parce que j'ai tort que vous avez raison.

  8. #8
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    pour supprimer au début et à la fin c'est trim
    à l'intérieur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explode(" ",$chain) ou $chain = str_replace(" ","",$chain);
    pour explode tu dois récupérer les éléments du tableau pour les concaténer

    Et pour le preg oui dans une condition if, et si c'est vrai les lignes dans ton seront effectué

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explode(" ",$chain) ou $chain = str_replace(" ","",$chain);
    Bon là encore, ça va. Ce bout de code n'occasionne pas chez moi de colisions neuronales trop invalidantes.

    Maintenant comme j'ai peur de rien , j'ose la question suivante :

    Comment c'est-y que j'isole de $contenu les $chain qui ressemble à des <a href ...> pour les passer en paramètre à explode ?

    C'est atroce si je fais ça ?

    $chain= preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split) ?

    Et si pour tester si preg_match a renvoyé quelque chose, je fais, tenez vous bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($chain!="")
     
     {explode(" ",$chain) ou $chain = str_replace(" ","",$chain);}
    Manque de pot en plus d'être idiot, ça prend pas les tableaux...
    C'est pas parce que j'ai tort que vous avez raison.

  10. #10
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Et plutot ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$chaine,$split))
    {
       $chaine = str_replace(" ","",$chaine);
    }

  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
    Bein je vais me faire frapper, mais j'ai fait ça, et ça fonctionne pas, mon lien est tronqué dans la balise, ça donne <a href="www.google.fr/ladress delapage.php">google</a> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    $split=" ";
    if(preg_match("#http:\/\/www\.([a-z]+\.[a-z]{3})#",$contenu,$split))
    {
       $contenu = str_replace(" ","",$contenu);
    }
    ?>
    Avec $contenu comme texte initial. D'ailleur je me demande si ce code, quand bien même il fonctionnerait pour un lien, fonctionnerait pour tous les liens du texte ?

    **edit**
    Ah dsl c'est peut être normal j'ai pas mis <a href devant http deux secondes je reviens.
    C'est pas parce que j'ai tort que vous avez raison.

  12. #12
    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 c'est zero, je suis nul en expression régulière, heuresement c'est pas ce qu'il ya de plus simple.

    D'ailleur dans le truc je sais même pas comment écrire la chaine complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(preg_match("#<a href=\"http:\/\/www\.([a-z]+\.[a-z]{3}\">)#",$contenu,$split))
    J'ai fait ça pour prendre en compte le <a href devant http et le "> à la fin de la balise a, en échappant le tout avec des \ (oui je sais )

    En plus tout ça c'est parce que la nouvelle version d'IE veut pas m'afficher mon overflow horizontal et que ça casse mes divs si y'a un texte trop long......

    (y'en a qui vont morfler avec IE 7 question affichage, ça réserve des surprises. Mais bon on est sur le forum php là).
    C'est pas parce que j'ai tort que vous avez raison.

  13. #13
    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
    Si j'ai bien suivi tu veux maintenant supprimer les espaces dans les liens? Genre:

    <a href="#">Un lien avec espace</a>
    devient
    <a href="#">Unlienavecespace</a>
    Si c'est ça, ce code fonctionne chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function delete_spaces($results) {
       return "<a ".$results[1]." href='".$results[2]."' ".$results[3].">".
              str_replace(" ", "", $results[4]).
              "</a>";
    }          
    $str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);

  14. #14
    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
    Salut Anduriel,

    Non en fait je veux pas supprimer les espaces dans le texte du lien mais bien dans l'url :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <a href="http://www.une url.com/avec_esp aces">Un lien avec espace ou sans espace</a>
    devient
    <a href="http://www.uneurl.com/sans_espace">un lien avec espace</a>
    En fait mon script va tout hacher, et c'est le but. Le texte du lien (qui apparait sur la page donc) doit aussi être hacher si nécessaire.
    Mais après c'est l'url dans la balise qui risque aussi d'être hachée.
    Et là c'est grave ==> le lien ne fonctionne plus. Il faut donc recoler les morceaux de l'url éventuellement découpée par le script de hachage, mais pas le texte du lien qui lui doit rester découpé.
    C'est pas parce que j'ai tort que vous avez raison.

  15. #15
    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
    Tu modifies donc juste un peu la fonction. (Ce script est donc a utiliser après le pré-traitement sur la chaine):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function delete_spaces($results) {
       return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
              $results[4].
              "</a>";
    }          
    $str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);


  16. #16
    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
    Je pige pas ton code Anduriel, je bosse jamais avec les fonctions, j'ai justement décidé de m'y mettre aujourd'hui .
    Je peux pas utiliser un code que je comprend pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function delete_spaces($results)
    // à la place de $résult, je met le nom de la variable de contenu du formulaire ?
     {
       return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
              $results[4].
              "</a>"; // c'est quoi ces $result[1], [2] etc...
    }          
    $str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces"//c'est quoi ça 
    c'est pour appeler la fonction ou quoi?,
     $chaine//$chaine c'est le nom du contenu aussi ? 
    alors c'était quoi le $result au dessus ? );
    C'est pas parce que j'ai tort que vous avez raison.

  17. #17
    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
    Si tu veux connaitre les détails il faut voir la fonction preg_replace_callback() justement
    Je t'explique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = preg_replace_callback("#\<a(.*)href\='([^']*)'(.*)>(.+)\<\/a\>#", "delete_spaces", $chaine);
    delete_spaces est une fonction vers laquelle renvoit cette expression régulière pour le remplacement de la chaine cherchée. Tu peux donc y placer des conditions, des traitements, et en fonction de ceux-ci remplacer par ce que tu veux. $chaine c'est tout simplement la variable dans laquelle se trouve le texte déjà formaté (par ta fonction qui place des espaces). Ma fonction delete_spaces est donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function delete_spaces($results)
    {
       return "<a ".$results[1]." href='".str_replace(" ", "", $results[2])."' ".$results[3].">".
              $results[4].
              "</a>";
    }
    Par définition dans le manuel, la fonction vers laquelle est renvoyé le regex comporte un paramètre, tu lui donnes le nom que tu veux (ici $results). Cette variable contient dans un tableau tout ce que tu as récupéré dans les parenthèses capturantes du regex ($results[0] est tout ce qui a été récupéré, $results[1] la première parenthèse, $results[2] la deuxième etc).
    Donc comme tu vois cette fonction retourne (return) un nouveau lien avec les options présentes dans les liens trouvés ($results[1], $results[3]), son texte ($results[4]) et enfin son adresse ($results[2]) qui est traitée de façon à remplacer les espace (" ") par rien ("").

    Si t'as encore des problèmes dit le moi.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2013, 03h09
  2. Réponses: 2
    Dernier message: 08/02/2013, 17h21
  3. Réponses: 1
    Dernier message: 05/11/2009, 15h19
  4. Affichage des caractères nuls en début d'une chaine de caractère
    Par Saly2008 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/10/2008, 10h48
  5. Réponses: 13
    Dernier message: 31/03/2008, 09h14

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