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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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

+ 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