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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    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 éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    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 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,

    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 éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    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 éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    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