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 :

Réduire une URL dans un texte et la rendre active [RegEx]


Sujet :

Langage PHP

  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut Réduire une URL dans un texte et la rendre active
    Bonjour,

    Dans cette discussion, je cherchais comment extraire d'un texte les url pour les transformer en lien actif.

    J'y suis arrivé mais maintenant je veux réduire les url trop longues à l'affichage à leurs 30 premiers caractères suivis de '...'.

    Exemple :
    Cela devrait devenir :
    Voici un texte avec une url www.unsite.com/le-titre-super-...
    J'ai essayé de jouer avec les fonction preg_ de PHP mais je cale.

    J'arrive d'une part à preg_replace les url complètes du texte, comme expliqué dans l'autre discussion. J'arrive par ailleurs à extraire les urls à l'aide de preg_match_all. J'ai essayé aussi un coup de preg_split mais je ne vois pas comment assembler le tout pour avoir évidemment l'url complète dans la balise <a> et l'url raccourcie à l'affichage donc entre <a> et </a>.

    Pour le moment, pour transformer les url, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	$pattern = '`(https?://|www)([a-zA-Z0-9\/.\-_]+)`';
    	$replacement = "<a href='\\1\\2' class='urldansmsg' target='_blank' >\\1\\2</a>";
     
    	$texte = preg_replace($pattern, $replacement, $info['message']); 
     
    	$pattern = "`href='www`";
    	$replacement = "href='http://www";
    	$texte = preg_replace($pattern, $replacement, $texte); 
     
    	echo $texte;
    Une idée ou une fonction qui va bien à me proposer ?

    EDIT :
    En fait je voudrais faire quasiment comme ça s'affiche dans ce message !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Membre expérimenté
    Homme Profil pro
    DSI interne
    Inscrit en
    Juin 2011
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DSI interne
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2011
    Messages : 197
    Par défaut
    Bonjour,

    Est ce que la simple fonction strstr() ne peu pas résoudre le problème ?

    Ce qui donnerais dans ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $url = "http://www.unsite.com/le-titre-super...t-sur-son-lien";
    $url_cut = strstr($url, '...', true);
    echo $url_cut;
    ?>
    Ça sera aussi moins lourd que les regex.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je ne vois pas du tout en quoi cela peut m'aider !

    Soit un texte contenant de 1 à plusieurs morceaux commençant par "http://" ou "www".
    Il faut transformer à l'affichage tous ces morceaux en lien actif tout en gardant l'ensemble du texte. Jusque là, j'ai réussi avec le code donnée dans mon premier message.

    Mais il faut en plus que le texte affiché des url soit limité à 30 caractères.

    Je dois au final avoir un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Début du texte <a href="url_complete">url_limitée</a> fin du texte
    Ce qui donnera à l'affichage :
    Début du texte www.url_limitée.com/debut_lien... fin du texte
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre expérimenté
    Homme Profil pro
    DSI interne
    Inscrit en
    Juin 2011
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DSI interne
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2011
    Messages : 197
    Par défaut
    Si on reprends ton ancien post on peu faire comme ca, je n'avais pas compris la subtilité avec les '...' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $subject = "http://www.unsite.com/le-titre-super...t-sur-son-lien";
    preg_match_all('`(https?://|wwww)[^\ ]+`', $subject, $url);
    $url = $url[0][0];
    $url_cut = substr($url, 0, 30);
    echo "Début du texte <a href=".$url.">".$url_cut."</a>... fin du texte";
    ?>

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    Bah voilà un truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    $txt = 'http://www.unsite.com/le-titre-super-long-qui-ne-sert-a-rien.html';
     
    $pattern = '`(https?://|www)([a-zA-Z0-9\/.-]+)`'; // tu as oublié le tiret comme séparateur j'ai rajouté à la fin 
    preg_match($pattern, $txt, $matches);
     
    array_shift($matches);
    $href  = implode('', $matches);
    $short = substr($matches[1], 0, 27).'...';
     
    ?>

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Merci mais je ne vois toujours pas avec ça comment remplacer le texte des urls longues dans le texte par l'url courte, tout en ayant le lien actif.
    Je rappelle qu'il peut y avoir un texte avec de zéro à plusieurs morceaux à transformer en urls courtes actives.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Il faut utiliser preg_replace_callback

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function shrink($match)
    {
        return '<a href="'.$match[0].'">'.substr($match[0],0,10).'...</a>';
    }
     
    $text = "Lorem ipsum dolor sitamen. http://google.com . Le voici avec une seconde url http://www.unsitetreslongpourvoir.com";
    $pattern = '`(https?://|www)([a-zA-Z0-9\/.]+)`';
    echo preg_replace_callback($pattern,'shrink',$text);
    ne reste plus qu'à adapter shrink(); pour que ça réponde complètement à ton besoin

    Si je peux me permettre un conseil , plutôt que de couper comme un sauvage l'url il serait sans doute plus sympa de ne garder que le domaine par exemple.

    Edit --
    Version avec fonction anonyme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo preg_replace_callback(
    	$pattern, function($match){
    		return '<a href="'.$match[0].'">'.substr($match[0],0,10).'</a>';
    	},$text
    );
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ça fonctionne ; merci !


    EDIT :
    J'ai parlé un peu vite !
    Ça fonctionne chez moi mais pas sur le serveur qui est en PHP 5.2.17.
    Fonction anonyme non compatible avec cette version peut-être ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ça fonctionne ; merci !


    EDIT :
    J'ai parlé un peu vite !
    Ça fonctionne chez moi mais pas sur le serveur qui est en PHP 5.2.17.
    Fonction anonyme non compatible avec cette version peut-être ?
    Oui les fonctions anonyme c'est en 5.3 il me semble. Suffit d'utiliser la première version sans la fonction anonyme
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    OK.
    J'ai créé deux fonctions php pour généraliser le code utilisé dans plusieurs programmes PHP et ça fonctionne.

    Merci.

    EDIT :
    J'ai encore écrit trop vite !

    Voici les deux fonctions :
    Code PHP : 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
    /**
     * replaceURL
     * Formate une url incluse dans un texte
     * @param array $match : alimenté par fonction preg_replace_callback, contient un texte d'url
     * @return string la balise <a> contenant l'url
     */
    function replaceURL($match)
    {
    	return '<a href="'.$match[0].'" class="urldansmsg" target="_blank">'.substr($match[0], 0, 30).'</a>';
    }
     
    /**
     * convertInURL
     * Transforme en URL active les morceaux d'un texte interprétable comme une URL
     * @param string $text : le texte contenant des URL à convertir
     * @return string : le texte converti
     */
    function convertInURL ($text)
    {
    	$pattern = '`(https?://|www)([a-zA-Z0-9\/.\-_+?&=#]+)`';
     
    	return preg_replace_callback($pattern, 'replaceURL', $text);
    }

    Si le lien figurant dans le texte ne commence pas par "http://" mais directement par "www", l'url devient relative au site (http://mon-site.com/www.le_stite_cib...suite_de_l_url).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre expérimenté Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Par défaut
    c'est le navigateur qui n'aime pas l'absence de http://

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function replaceURL($match)
    {
      $adresse = ($match[1] == 'www') ? 'http://' . $match[0] : $match[0];
      return '<a href="'.$adresse.'" class="urldansmsg" target="_blank">'.substr($match[0], 0, 30).'</a>';
    }

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    OK merci, ça fonctionne.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Insérer une URL dans du texte
    Par atm0sfe4r dans le forum wxWidgets
    Réponses: 5
    Dernier message: 24/04/2009, 09h48
  2. Parser une url dans un string au format texte
    Par andromeda dans le forum C#
    Réponses: 2
    Dernier message: 02/02/2009, 04h16
  3. [RegEx] Trouver une URL dans un texte
    Par Lo-chan dans le forum Langage
    Réponses: 7
    Dernier message: 13/09/2007, 15h21
  4. Réponses: 3
    Dernier message: 27/04/2006, 13h33

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