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 php [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 318
    Points : 295
    Points
    295
    Par défaut bbcode url php
    bonjour, débutent en php, j’aimerai faire un bbcode url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data = preg_replace('/\[url=([^ ]+).*\](.*)\[\/url\]/', '<a href="$1" target="_blank" rel="nofollow">$2</a>', $data);  
    $data = preg_replace('/\[url\](.*)\[\/url\]/', '<a href="$1" target="_blank" rel="nofollow">$1</a>', $data);
    sa fonctionne pas, voici le résultat : rel=”nofollow”>https://.........

    Code : 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
        public function bbcode($data)
        {
            if ($this->options->enable_bbcode) {
                // Remplace 
                $data = preg_replace('/\[b\](.*?)\[\/b\]/', '<strong>$1</strong>', $data);
                // Remplace             $data = preg_replace('/\[q\](.*?)\[\/q\]/', '<q>$1</q>', $data);            
                // Remplace [user][/user]
                $data = preg_replace('/\[user\](.*?)\[\/user\]/', '<em><strong><font color="#E6001C">$1</font></strong></em>', $data);
                // Remplace [color=][/color]
                $data = preg_replace('/\[color=([^ ]+).*\](.*)\[\/color\]/', '<font color="$1">$2</font>', $data);            
                // Remplace 
                $data = preg_replace('/\[i\](.*?)\[\/i\]/', '<em>$1</em>', $data);
                // Remplace 
                $data = preg_replace('/\[url=([^ ]+).*\](.*)\[\/url\]/', '<a href="$1" target="_blank" rel="nofollow">$2</a>', $data);           
                // Remplace 
                $data = preg_replace('/\[url\](.*)\[\/url\]/', '<a href="$1" target="_blank" rel="nofollow">$1</a>', $data);
            }                      
     
            return $data;
        }

    Merci

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    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 905
    Points : 6 693
    Points
    6 693
    Par défaut
    Avant toute chose, il faut savoir qu'il existe une extension pour gérer le bbcode ainsi qu'une foultitude de packages. Mais c'est un bon support pour s'entraîner aux regex car ça soulève énormément de problèmes. D'ores et déjà, je t'invite à lire les tutos de Guillaume Rossolini sur le site afin d'acquérir les bases.

    Maintenant concernant tes patterns, elles ont toutes le même défaut: elles utilisent le point . ce qui est beaucoup trop imprécis, peu efficace notamment quand il est affublé d'un quantificateur gourmand et source d'erreurs.

    (désolé mais j'ai du mettre des concaténations un peu partout pour que le parser du forum n'interprète pas les balises)
    Par exemple si j'ai la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = 'truc [' . 'url]www.toto.org[/url] pouet [' . 'url]www.tata.org[/url] bidule';
    , ta pattern
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pat = '~\[' . 'url](.*)\[/url]~';
    va prendre de la première balise ouvrante à la dernière balise fermante parce que le point représente n'importe quel caractère et le quantificateur gourmand * prendra la plus grande chaîne possible.

    Une solution consiste à rendre le quantificateur non gourmand en lui adjoignant un ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pat = '~\[' . 'url](.*?)\[/url]~
    . Bon bah là ça marche mieux et ça renvoie bien les deux occurrences.

    Cela dit ce n'est pas forcément une solution très robuste. Prenons par exemple une chaîne avec du bbcode mal formé ou simplement imbriqué comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = '[' . 'b]riri [' . 'b]fifi[/b] loulou[/b]';
    . (Bien sur imbriquer deux balises b ne sert à rien mais rien n'empêche de l'écrire.)
    Et bien si j'utilise le même type de pattern (avec un quantificateur non gourmand):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pat = '~\[' . 'b](.*?)\[/b]~';
    , je me ferai avoir aussi car la pattern prendra de la première balise ouvrante jusqu'à la première balise fermante, soit '[' . 'b]riri [' . 'b]fifi[/b]'.

    Que faire?

    On peut interdire les balises imbriquées dans la pattern en se débarrassant du point et en le remplaçant par une classe de caractères qui exclue les crochets ouvrants: '~\[' . 'b]([^[]*)\[/b]~';

    Ou bien avec une sous pattern qui interdit les autres balises b: '~\[' . 'b]([^[]*(?:\[(?!/?b])[^[]*)*)\[/b]~'Dans les deux cas, pour pouvoir remplacer entièrement la chaîne du dernier exemple, il faudra faire autant de passes qu'il y a de niveaux d'imbrication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str = '[' . 'b]riri [' . 'b]fifi[/b] loulou[/b]';
    do {
        $str = preg_replace('~\[' . 'b]([^[]*(?:\[(?!/?b])[^[]*)*)\[/b]~', '<strong>$1</strong>', $str, -1, $count);
    } while($count);
    À noter également qu'avec ces deux patterns, en cas d"imbrication, c'est la partie la plus intérieure qui est remplacée en premier ce qui veux dire qu'avec une chaîne mal formée comme:'[' . 'b]riri [' . 'b]fifi[/b] loulou', le résultat sera [b]riri <strong>fifi</strong> loulou et non pas <strong>riri [b]fifi</strong> loulou.

    Créer un parser bbcode implique de définir les comportements par défaut en cas de chaîne mal formée. C'est une chose à laquelle il faut penser avant de se lancer dans le codage.

    Tu n'es pas au bout de tes peines mais pour l'instant on va s'en tenir là pour digérer. Quand tu auras fait évoluer ton code et mis tes idées au clair on verra pour la suite.

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

Discussions similaires

  1. [RegEx] bbCode url(?), unknown identifier '-'
    Par Mazike dans le forum Langage
    Réponses: 1
    Dernier message: 01/10/2008, 23h53
  2. [AJAX] Url php
    Par blackbird1 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/03/2008, 15h12
  3. Ancrage avec une URL PHP
    Par HwRZxLc4 dans le forum Langage
    Réponses: 2
    Dernier message: 04/10/2007, 15h55
  4. [URLRewriting] Transposer toutes les url .php en .html
    Par asthyanax dans le forum Apache
    Réponses: 1
    Dernier message: 26/06/2007, 00h07

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