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 :

Effacer une "balise"


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut Effacer une "balise"
    Bonjour,

    J'ai utilisé un système pour qu'un ami qui n'y connait rien en balises HTML, puisse mettre en forme ses articles sur un blog (avec des photos, des titres, des images,...).

    Par exemple, lorsqu'il veut ajouter une image, il suffit qu'il renseigne dans son article [IMAGE]mon_image.jpg[/IMAGE], pour une vidéo youtube [YOUTUBE]codedesavideo[/YOUTUBE] et cela se transforme en vraies balises html sur son site.

    Par contre, pour afficher un résumé texte, j'ai besoin de supprimer certaines de ces balises et leur contenu.

    Par exemple, je voudrai que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [IMAGE]mon_image.jpg[/IMAGE]
    Ici tout mon blabla article texte
    [YOUTUBE]codedesavideo[/YOUTUBE]
    Et le reste de mon article texte
    Me retourne uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ici tout mon blabla article texte
    Et le reste de mon article texte
    J'ai pensé pour cela utiliser plusieurs preg_replace('XXXXXXXXX','',$contenu); (un pour chaque balise et son contenu à supprimer)
    Mais je ne sais pas quelles expressions utiliser à la place des XXXXXXXXX

    Vous auriez une idée svp?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    as-tu consulté la FAQ ?

    En adaptant :
    $str = "[IMAGE]mon_image.jpg[/IMAGE]
    Ici tout mon [STRONG]blabla blabla[/STRONG] article texte
    [YOUTUBE]codedesavideo[/YOUTUBE]
    Et le reste de [EM]mon article texte[/EM]";
    
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // suppression de certains BBcodes AVEC suppression du contenu :
    $delete_all_balises = '(IMAGE|YOUTUBE)';
    $str = preg_replace('#\['.$delete_all_balises.'\](.*)\[/'.$delete_all_balises.'\]#Usi', '', $str);
    echo $str.'<br />';
    On peut aller plus loin :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // suppression de certains BBcodes MAIS on conserve le contenu :
    $remove_bbc_balises = '(B|U|EM|STRONG)';
    $str = preg_replace('#\['.$remove_bbc_balises.'\](.*)\[/'.$remove_bbc_balises.'\]#Usi', '$2', $str);
    echo $str.'<br />';
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // suppression de TOUT BBcode MAIS on conserve le contenu :
    $remove_all_balises = '(.*)';
    $str = preg_replace('#\['.$remove_all_balises.'\](.*)\[/'.$remove_all_balises.'\]#Usi', '$2', $str);
    echo $str.'<br />';
    N.B. On suppose ici du BBcode SANS attribut.
    De la forme [ BLABLA ]hello[/ BLABLA ] (sans les espaces)

    Par contre : [ URL=xxxxxxx.com ]visiter mon site[/ URL ] n'est pas inclus. (sans les espaces)
    Pour l'inclure aussi, une petite modif. s'impose dans les regex.
    Mais ça... je te faire expérimenter/tester par toi-même !
    Dernière modification par Invité ; 19/07/2015 à 12h05.

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 018
    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 : 3 018
    Par défaut
    Tu peux le faire en un seul passage (retirer certaines balises avec leur contenu et les autres sans) en rendant la partie contenu optionnelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $rmContent = ['YOUTUBE', 'IMAGE'];
     
    $pattern = '~\[ (?:(?:' . implode('|', $rmContent) . ')] [^[]* \[/ )? [^]]* ]~iux';
    $str = preg_replace($pattern, '', $str);
    Ce code suppose que le BBCode est bien formé.

    Après (enfin plutôt avant) il faut se poser certaines questions avec un système de balises:
    • quels comportements par défaut le parser doit-il adopter quand les balises sont mal construites (balises non fermées, inexistantes ou qui se chevauchent)?
    • Les balises peuvent-elles être imbriquées? Si oui, lesquelles?
    • Les balises peuvent-elles avoir des attributs, lesquelles?


    Sinon, tu vas avancer à l'aveuglette et tu risques de devoir recommencer un bon bout de code si tu retrouves face à un problème que tu n'avais pas prévu.

    Tu as aussi la solution plus en amont: ne pas retirer de BBCode du tout!

    C'est simple, tu disposes déjà d'un parser qui se charge de transformer le BBCode en HTML. Donc pour extraire le texte, il suffit de le faire à partir de la version HTML avec DOMDocument.

  4. #4
    Membre confirmé Avatar de Valter
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2008
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2008
    Messages : 113
    Par défaut
    comme mentionné plus haut, dès que tu as un contenu variable entre tes balises il faut utiliser les expressions régulières

    là il te faut utiliser la fonction preg_replace

Discussions similaires

  1. Augmenter la hauteur du div/span de la balise &quot;code&quot;
    Par Djakisback dans le forum Evolutions du club
    Réponses: 10
    Dernier message: 24/01/2009, 14h31
  2. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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