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 :

Expression régulière et longueur de chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut Expression régulière et longueur de chaine
    Salut

    j'ai une expression régulière qui permet de formater une URL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $message = "blabla <a href="http://www.monsite.com" target="_blank">http://www.monsite.com</a> blablabla";
     
    $message = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])","<a href=\"<a href="file://\\1://\\2\\3\" target="_blank">\\1://\\2\\3\</a>" target=\"_blank\" class='style'><a href="file://1:////2//3/" target="_blank">\\1://\\2\\3</a><a>",$message);
     
    echo $message
    Dans certains cas, l'URL est beaucoup trop longue et ça déforme toute ma mise en page,
    existe t il un moyen d'afficher l'URL complète si elle fait moins de 50 car par ex, et dans le cas où elle en fait plus, d'afficher les 50 premiers car + ...

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    ben il te suffit de scinder ton texte en morceau contenant au plus un lien hypertexte, tu passes ta fonction pour extrire le lien, tu compares sa longueur avec son seuil, et si besoin tu remplaces...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    merci mais comment faire pour récupérer juste les URL ? s'il y en a plusieurs dans le message ?

  4. #4
    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 peux faire un preg_replace_callback qui teste la longeur de chaine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function test_lenght($matches) {
       $str = $matches[1]."://".$matches[2].$matches[3];
       if (strlen($str) > 50)
          return '<a href=\"'.$str.'" target=\"_blank\" class='style'>'.substr($str, 0, 50).'...<a>';
       else
          return '<a href=\"'.$str.'" target=\"_blank\" class='style'>'.$str.'<a>';
     
    }
     
    $message = preg_replace_callback("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "test_lenght", $message);
     
    echo $message
    Je ne suis pas très doué dans les expressions régulières alors ça se peut que ça ne fonctionne pas du premier coup.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    j'ai mis exactement ton code mais ça me fait cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Warning: preg_replace_callback(): Unknown modifier ':' in /...fichier.php on line 105

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    tu peux utiliser strlen pour connaître la longueur de ta chaîne
    tu peux utiliser substr pour récupérer la partie gauche d'une chaîne

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    oui mais bon mon message c'est :

    $message = "blabla http://www.monsite.com blablabla";

    donc je peux pas utiliser strlen et substr pour juste récupérer l'url

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    je n'ai pas dit cela
    j'avais cru comprendre que ton eregi_replace que je n'ai pas regardé te donne l'url dans la variable $message

    après, avec strlen et substr tu limites $message à 50

    si tu crois que ton eregi_replace est faux, je veux bien regarder (plus tard...)

  9. #9
    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
    Et mettant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message = preg_replace_callback("([[:alnum:]]+)\://([^[:space:]]*)([[:alnum:]#?/&=])", "test_lenght", $message);
    ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    non ça ne change rien, ça fait la même erreur avec le \ à la place de :

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    moi je suis nul en eregi (quand j'en fais un, pour qu'il fonctionne, il me faut au moins une semaine de dur labeur et réflexion)

    alors je te propose les principes suivants :

    première solution :
    • avec un strpos je cherche la position de http://
    • avec substr j'efface tout ce qui est devant
    • strpos pour trouver le premier espace
    • substr pour enregistrer tout jusqu'à cet espace, cela donne le premier url, à mettre dans un tableau
    • substr pour effacer tout ce qui est devant cet espace (donc l'url)
    • et recommencer la même séquence
    • faire cela avec une boucle while
    seconde solution
    • avec un explode sur les espaces pour récupérer un tableau avec tous les mots
    • faire une boucle sur le nombre d'éléments du tableau
    • ne sélectionner que les éléments qui contiennent http:// et voilà tes url
    naturellement c'est bâtard pour les spécialistes des eregi, mais au moins tu peux avancer dans ton projet, et plus tard quand tu auras un peu de temps et plus d'expérience, tu te pencheras à nouveau sur les eregi

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    merci mais ça risque d'être vraiment lourd au niveau traitement,
    c'est pour ça que je voulais régler ça par expression régulière.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    cela paraît lourd mais je prétends que cela ne se verra pas sur ton temps d'exécution, sauf si tu fais 150000 recherches d'url

    bon je n'ai plus envie de me fatiguer mais je verrai demain

    petite remarque quand-même sur les ereg : primo, à mon avis, autant faire une recherche sur http que sur :// et secundo je ne pense pas qu'un point fasse partie de [[:alnum:]]

  14. #14
    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
    Essaoi ça:

    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
    <?
    $message = "Salut, <a href="http://www.killtrees.free.fr/test/index.php?id=1&php=2" target="_blank">http://www.killtrees.free.fr/test/index.php?id=1&php=2</a># test";
    function test_lenght($matches) {
       $str = $matches[1]."://".$matches[2];
       if (strlen($str) > 50)
          return '<a href="'.$str.'" target="_blank" class="style">'.substr($str, 0, 50).'...<a>'.$matches[3];
       else
          return '<a href="'.$str.'" target="_blank" class="style">'.$str.'<a>'.$matches[3];
     
    }
     
    $message = preg_replace_callback("#(http|ftp)://([A-Za-z0-9\.\?/&\=\#]+)([[:space:]]+)#Us", "test_lenght", $message);
     
    echo $message;
    ?>
    Ca fonctionne chez moi.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    effectivement ça fonctionne pour des url simples,
    mais dès qu'il y a une variable ?var=variable, ça ne fonctionne plus.

  16. #16
    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
    Dans mon exemple avec
    http://www.killtrees.free.fr/test/index.php?id=1&php=2#


    Ca fonctionne.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    j'ai testé ton lien et ça ne fonctionne pas.

  18. #18
    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
    Avec exactement mon code?!
    C'est bizarre... il se passe quoi alors chez toi?

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    autant pour moi, j'avais un autre bout de code avant qui génait ton code (la fonction htmlspecialchars qui transformait le & en &amp; et donc ça ne fonctionnait plus),

    maintenant ça marche mais par contre si le lien se trouve à la fin du texte, là il n'est pas remplacé,

    que faut il modifier pour que cela soit prit en compte aussi ?

  20. #20
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $message = preg_replace_callback("#(http|ftp)://([A-Za-z0-9\.\?/&\=\#]+)([[:space:]]+|$)#Us", "test_lenght", $message);
     
    echo $message;
    ?>
    Et comme ça? Je ne sais pas si la syntaxe est comme ça, mais ça doit pas être loin.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Expression régulière: extraction de sous-chaine
    Par Icegirl dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2014, 11h07
  2. Expression régulière. Négation d'un chaine
    Par Ruyneau dans le forum Général Python
    Réponses: 4
    Dernier message: 20/02/2012, 08h29
  3. Expression régulière : Découpage d'une chaine
    Par hisoft dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 23/11/2010, 10h33
  4. Expression régulière : tester existence sous-chaine en fin de chaine
    Par GEFIRO1 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/09/2007, 12h03
  5. Réponses: 11
    Dernier message: 24/03/2006, 11h12

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