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 :

bbcode url regexe [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut bbcode url regexe
    Bonsoir,

    Dans un texte, peut se trouver des liens url entouré de balises bbcode mais peuvent être envoyé de plusieurs façons,

    Exemple 1 => [ URL ]http://developpez.net/[ /URL ]
    Exemple 2 => developpez.net/

    Exemple 1 => [ URL=http://developpez.net/]http://developpez.net/[ /URL ]
    Exemple 2 => [ URL=developpez.net/]http://developpez.net/[ /URL ]

    Exemple 5=> [ URL=http://developpez.net/]Le lien est un texte[ /URL ]
    Exemple 6=> [ URL=developpez.net/]Le lien est un texte mais http:// n'a pas été saisie[ /URL ]


    Voila grosso modo le problème, je cherche à construire une reg qui dans un premier temps supprime tout éventuel mot trouvé "http://" ou "https://", celui-ci est ajouté par la suite dans la balise <a href="http://... mais celle-ci bug car je souhaite pas modifier uniquement le contenu dans la balise « [URL= » et pas le contenu entre les deux balises..

    [CODE] $bb_string = preg_replace("#\[URL=((http[s])://)$#i", "", $bb_string);
    $bb_string = preg_replace("#\[URL=([^\r\n\t<\"]*?)\[\/URL\]#sie", "<a href=\"http://$1\" target=\"_blank\">$2</a>", $bb_string);

    # Second cas de figure =http://lien...
    $bb_string = preg_replace("#\[URL\]((http[s])://)\[URL\]#i", "", $bb_string);
    $bb_string = preg_replace("#\[URL\]([^\r\n\t<\"]*?)\[\URL\]#sie", "<a href=\"http://$1\" target=\"_blank\">$2</a>", $bb_string);
    [/CODE]

    La seconde ligne consiste donc à rechercher dans la chaine soit une des deux possibilités (avec ou sans le signe = renseigné) et à construire la balise <a Href="http://...
    Dans le cas ou le = n'est pas renseigné le http:// est supprimé

    merci d'avance pour vos précieux conseils,

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Je pense que le mieux c'est de s'occuper de tous les cas en même temps et de faire le tri dans une fonction de callback avec preg_replace_callback, comme ça tu conserve le scheme qui t'est donné (au lieu de transformer un https:// en http://) et tu ne parcours ta chaîne qu'une seule fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $bb_string = preg_replace_callback('~\[url
        (?|
            = ([^]]*) ] ( [^[]*+ (?:\[(?!/url) [^[]*)*+ )
          |
            ] (( [^[]*+ (?:\[(?!/url) [^[]*)*+ ))
        )
        [/url]~ix', function ($m) {
            $url = trim($m[1]);
            return '<a href="' . ( parse_url($m[1], PHP_URL_SCHEME) ? '' : 'http://')
                  . $m[1] . '" target="_blank">' . trim($m[2]) . '</a>';
    }, $bb_string);

  3. #3
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    salut, merci pour l'exemple, j'ai essayé de le tester mais rien ne s'affiche quelque chose m'échappe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $bb_string = "...du texte [ URL]http://developpez.net/[/URL ], du texte... [ URL]developpez.net/[/URL ] du texte... [ URL=http://developpez.net/]Un lien[/URL ] du texte... [ URL=developpez.net/]http://developpez.net/[/URL ]";
    	$bb_string = preg_replace_callback('~\[URL
        (?|
            = ([^]]*) ] ( [^[]*+ (?:\[(?!/URL) [^[]*)*+ )
          |
            ] (( [^[]*+ (?:\[(?!/URL) [^[]*)*+ ))
        )
        [/URL]~ix', function ($m) {
            $url = trim($m[1]);
            return '<a href="' . ( parse_url($m[1], PHP_URL_SCHEME) ? '' : 'http://')
                  . $m[1] . '" target="_blank">' . trim($m[2]) . '</a>';
         }, $bb_string);
     
    	echo $bb_string;

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Bah t'as des espaces dans tes balises. Est-ce que c'est normal? Si tu veux les figurer dans la pattern tu devras les mettre entre crochets car la pattern utilise le mode qui ignore les espaces (modificateur x).

  5. #5
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Bah t'as des espaces dans tes balises. Est-ce que c'est normal? Si tu veux les figurer dans la pattern tu devras les mettre entre crochets car la pattern utilise le mode qui ignore les espaces (modificateur x).
    j'ai mis des espaces parce que le forum les interprètes

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Au(?:tant| temps) pour moi, j'ai oublié d'échapper un crochet ouvrant. Sauras-tu le trouver?

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

Discussions similaires

  1. [RegEx] bbcode url php
    Par XeGregory dans le forum Langage
    Réponses: 1
    Dernier message: 07/10/2017, 00h31
  2. [RegEx] Ma BBCode URL avec gestion d'ancre
    Par 47-47 dans le forum Langage
    Réponses: 1
    Dernier message: 27/08/2011, 11h42
  3. [RegEx] bbCode url(?), unknown identifier '-'
    Par Mazike dans le forum Langage
    Réponses: 1
    Dernier message: 01/10/2008, 23h53

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