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 :

Regex mise en forme de lien [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut Regex mise en forme de lien
    Bonjour,

    J'obtiens des résultats étranges avec cette regex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '![^>](https?\://www|[a-z]+)\.[a-z\-_0-9]+\.(com|net|fr|org|info)!isU'
    Lorsque je l'applique sur le texte: "http://www.test.com" dans un preg_replace
    avec comme chaine de remplacement '$0', la chaine sortante est bien "http://www.test.com".

    Par contre, si je mets la chaine de remplacement '<a href=\'$0\'>$0</a>' (créer un lien), le code généré est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http:/<a href='/www.test.com'>/www.test.com</a>
    Le contenu de $0 est donc altéré, je ne comprends pas pourquoi.

    Le code de test entier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $bbLink = '![^>](https?\://www|[a-z]+)\.[a-z\-_0-9]+\.(com|net|fr|org|info)!isU';
    $htmlLink = '<a href=\'$0\'>$0</a>';
    $texte = preg_replace($bbLink, $htmlLink, $texte);
    Merci d'avance pour votre aide.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    J'ai testé (grâce au super site http://www.phpliveregex.com/ ) et j'obtiens la même chose que toi

    Si on remplace par '', on obtient en sortie http:/. Donc visiblement, le texte capturé par le pattern est uniquement /www.test.com.

    Bon, en revanche, je ne sais pas pourquoi.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut
    Merci quand même pour ton aide.

    Edit: bon, le souci a l'air de venir du début de la regex: [^>], je voulais dire que le lien ne peut pas commencer par un >, parce que je traite déjà le texte pour formatter les liens avant (les www.truc.com deviennent http://www.truc.com) puis je traite les cas où le texte contient du bbcode [u rl=monUrl]truc[/u rl] ou [u rl]monUrl[/u rl] pour les transformer en liens, donc pour ne pas traiter deux fois le même lien (qui sera: <a href=...</a>) je teste si la chaine a déjà été traitée, pour enlever les cas suivants:

    <a href='monUrl'>monUrl</a>
    et (il n'est pas dans la regex ici)
    <a href='monUrl'>monUrl</a>

    Pour ne pas se retrouver avec une chaine qui au final serait:

    <a href='<a href='monUrl'>monUrl</a>'><a href='monUrl>monUrl</a></a>

    bref, des liens contenus dans des liens du au fait qu'ils soient traités plusieurs fois.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    si c'est juste pour tester la validité d'une URL, PHP le fait nativement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filter_var($url, FILTER_VALIDATE_URL)
    Et pour dépiauter une URL, tu as aussi parse_url()

  5. #5
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut
    Ca teste la validité mais surtout traite les url du texte en les transformant en liens html. Ca ne résout pas le but de la regex: transformer les url d'un texte donné, non traitées au préalable, en lien html.

  6. #6
    Membre averti
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Points : 334
    Points
    334
    Par défaut
    A priori j'ai réussi à faire la regex que je voulais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '!([^\'>]|^)((https?://www|[a-z]+)\.[a-z\-_0-9]+\.(com|net|fr|org|info))!isU'
    Donc ça ne peut pas commencer par un ' ni >

    edit:

    Le code "final" si quelqu'un voudrait s'en servir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //formatage des liens www.site.com en http://www.site.com
    $bbLink = '!(\040+|^)(www\.([a-z0-9\-_])+\.(com|net|fr|org|info))!isU';
    $formatage = '$1http://$2';
    $texte = preg_replace($bbLink, $formatage, $texte);
    echo $texte.'<br />';
     
    //lien non précisé->lien html
    $bbLink = '!([^\'>]|^)((https?://www|[a-z]+)\.[a-z\-_0-9]+\.(com|net|fr|org|info))!isU';
    $htmlLink = "$1<a href=\"$2\">$2</a>";
    $texte = preg_replace($bbLink, $htmlLink, $texte);

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/09/2007, 12h52
  2. Mise en forme CSS et lien
    Par debie1108 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 14/02/2007, 16h01
  3. Mise en forme d'un lien
    Par Blink182 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 02/11/2006, 17h24

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