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 :

Fermeture de BBCode


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Points : 72
    Points
    72
    Par défaut Fermeture de BBCode
    Bonjour, je doit développer un forum et je souhaite utiliser mon propre système de BBCode avec un textarea.
    Je rencontre actuellement le problème suivant :

    Comment savoir si une balise [g] a ça fermeture [/g] après son ouverture ?
    Je ne veux pas m'embêter pour créer ce système. En gros je veux vérifier que si une balise est ouverte, je vérifie si plus loin dans le texte on à bien une fermeture sinon j'en rajoute une à la fin.

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Tu peux utiliser strpos().

    Je ne veux pas m'embêter pour créer ce système.
    Dans ce cas, je te conseille vivement d'utiliser les codes existants : la gestion du BBCode, ce n'est pas trivial et tu auras toujours des cas qui t'obligeront à "t'embêter pour créer ce système" !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Points : 72
    Points
    72
    Par défaut
    Bonjour,

    Je te remercie pour ta réponse.

    Existe t-il une fonction comme strpos() où il peut y avoir plusieurs occurences dans un tableau ?

    Merci d'avance

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Points : 72
    Points
    72
    Par défaut
    Voila, le but n'étant pas de rendre l'HTML valide mais juste s’arranger qu'un message ne foire pas le design :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
    	//$session_start();
     
    	# -----------------------------------------------------------------------
    	# Fonction main
    	function main($src) {
    		$lstBalise = array('g', 'i', 's', 'q', 'c');
     
    		// Met en minuscule les bbcodes et gestion des fermetures.
    		for ($i = 0; $i < count($lstBalise); $i ++) {
    			$src = str_replace("[" + strtoupper($lstBalise[$i]) + "]", "[" + $lstBalise[$i] + "]", $src);
    			$src = str_replace("[/" + strtoupper($lstBalise[$i]) + "]", "[/" + $lstBalise[$i] + "]", $src);
    			$src = verif_fermeture($lstBalise[$i], $src);		
    		}	
    		echo $src;
     
    	}
     
    	# -----------------------------------------------------------------------
    	# Ajoute une/des fermeture(s) de bbcode si il en manque(s)
    	function verif_fermeture($bal, $src) {
    		$debBal = count(explode("[".$bal."]", $src)) - 1;
    		$finBal = count(explode("[/".$bal."]", $src)) - 1;	
     
    		// Met le meme nombre de d'ouverture que de fermeture (où inversement).
    		if ($debBal > $finBal) {
    			for ($i = 0; $i < ($debBal - $finBal); $i ++) { $src = $src."[/".$bal."]"; }
    		}
    		elseif ($debBal < $finBal) {			
    			for ($i = 0; $i < ($finbBal - $debBal); $i ++) { $src = $src."[".$bal."]"; }
    		}		
     
    		// Nouveau nombre exacte
    		$debBal = count(explode("[".$bal."]", $src)) - 1;		
     
    		// Tableau des positions d'ouverture et de fermeture.
    		$nb_debPos = posiBalise($src, "[".$bal."]", $debBal);
    		$nb_finPos = posiBalise($src, "[/".$bal."]", $debBal);
     
    		// Verification si les ouvertures sont avants les fermetures.
    		$nbSupp = 0;
    		for ($i = 0; $i < count($nb_debPos); $i ++) {
    			if ($nb_finPos[$i] < $nb_debPos[$i]) { $nbSupp = $nbSupp + 1; }
    		}	
     
    		// On supprime le nombre d'occurence dont les balises sont inversées.
    		if ($nbSupp > 0) {
    			$src = str_replace("[".$bal."]", "", $src, $nbSupp);
    			$src = str_replace("[/".$bal."]", "", $src, $nbSupp);
    		}		
    		return $src;
    	}
     
    	# -----------------------------------------------------------------------
    	# Retourne un tableau de position d'une balise dans une source
    	function posiBalise($src, $bal, $nb) {
    		$lst = array();
     
    		for ($i = 0; $i < $nb; $i ++) {		
    			if ($i == 0) { array_push($lst, strpos($src, $bal)); }
    			else { array_push($lst, strpos($src, $bal, $lst[$i - 1] + strlen($bal))); }
    		}	
    		return $lst;
    	}
     
    	if (!empty($_POST['editext'])) { main(htmlentities($_POST['editext'], ENT_QUOTES)); }
     
    ?>
    Dites moi se que vous en pensais.

    Merci d'avance.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Comme dit Bovino "la gestion du BBCode, ce n'est pas trivial" et difficile de te dire si ton code est suffisant.

    Cela dit si tu as fais pas mal de tests et qu'il fonctionne, tu peux toujours ensuite insérer le résultat dans un div et le protéger en css avec overflow: hidden; et autres word-wrap, ça devrait limiter les possibilités de déformation du design.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    pour le BBcode, je suis partisan d'un bon preg_match_all quitte à galérer pour établir les règles; c'est selon moi la meilleurs approche pour déduire qu’une portion de code est à même de définir un certain balisage qui ne correspond pas à un standard existant ou au préalable déclaré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("|<php>(.*)</php>|Us", html_entity_decode($tpl), $out, PREG_SET_ORDER);
    Conception / Dev

Discussions similaires

  1. Fermeture BBcode
    Par golgot13 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2004, 07h19
  2. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  3. Fermeture de ports
    Par DalKiT dans le forum Développement
    Réponses: 5
    Dernier message: 17/01/2004, 16h23
  4. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10
  5. Resau local => ouverture et fermeture
    Par Nutcase dans le forum Développement
    Réponses: 8
    Dernier message: 17/11/2002, 15h16

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