AMERABBCODE -VALIDER UN BBCODE (OU AUTRE)-

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 28 janv. 2007 à 21:14
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008 - 28 mai 2007 à 17:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41296-amerabbcode-valider-un-bbcode-ou-autre

audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
28 mai 2007 à 17:26
Source mise à jour ^^ (Si cela interesse encore quelqu'un XD)
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
1 févr. 2007 à 19:04
Exelente ton idée ! Je vais essayé d'adapter tout çà ;-)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
31 janv. 2007 à 19:06
Ce qui m'embète encore un peu, c'est le fait de faire passer les tags en paramètres.

Ce que j'aurais fait :
--> Une liste de tag (tag ouvert/tag fermé) pré-défini en statique qui consititurons la base du bbcode ( genre b,i,url etc...)
--> Une méthode permettant d'ajouter des tags. (ex :
public function AddTag($openTag, $closeTag) {
self::$TagsArray[] = array('open' => $openTag, 'close' => $closeTag);
}

Ce qui signifie que ta structure serait alors comme ca :
self::$TagsArray[]= array(
array('open' => ' ', 'close' => ' '),
array('open' => '', 'close' => ''),
array(....),
);

Par exemple, après c'est toi qui fait comme tu veux :)
Mais il te faut une méthode pour ajouter, supprimer et (optionnel) modifier un tag (quoi que.... :o)


Déja, en passant tes tags dans un tableau dans une propriété statique (ou non) dans ta classe, tu va voir que tu vas libérer beaucoup de code !
Et ca, je peux te le garantir :)
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
31 janv. 2007 à 13:38
Je n'ai jamais eu la prétention de dire que ma source était parfaite (loin de là :-) ) La source est en "initié" parce que j'ai cherché longuement pour faire ce script.

Je sais qu'il peut y avoir pleins d'amélioration et c'est pour celà que je poste ma source içi pour qu'on m'aide à comprendre mes erreurs.

Sinon pour l'histoire "While" VS "For" sur le site d'Anthomicro c'est le "While" qui l'emporte alors je l'utilise :-P
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
31 janv. 2007 à 13:11
for Vs while... long débat... lol... .. . ;o)

le for est préférable dans certain cas... cependant il me semble que le while/isset/préincrementation est plus rapide... c'est un maitre de conférence qui avait fait un sujet sur l'optimisation des scipt php... après d'une part ça date au moins de php 4.2 et d'autre part il faut voir le temps d'éxécution mais aussi la charge serveur notament au niveau de l'utilisation de la mémoire... quand au bench fait en php pur (time() & Co) il ne sont pas fiable pour moi... mieux vaut utiliser un module externe tel que xdebug... .. .

enfin bref là n'est pas le sujet... il y a d'autres optimisation possible avec cette source... enfin je dis ça... je n'ai pas regardé le code en détail cela reste donc un avis mais j'en reste persuadé... .. .

@ tchaOo°
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
30 janv. 2007 à 17:25
@Kankrelune : pour les benchs, j'en ai deja vu et l'auteur precise bien qu'il vallait mieux utiliser for() que while(). Reste a savoir qu'un benchmark, c'est pousse une entite a bout (l'auteur realise 1000 tours de boucles). Un element important quand meme, c'est d'eviter une erreur que je faisais souvent (en pensant que c'etait mieux) :
for ( $i=0; $i<count($Table); $i++ )
Sur que si on re-evalue a chaque tour de boucle, sa rame sec... Je crois meme que c'etait toi qui m'avait la reflexion sur un de mes codes ;-) Comme quoi j'ecoute bien ^^
Faut que je retrouve le lien et je le post apres.

@++
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 janv. 2007 à 17:08
"Pour moi une classe c'est une sorte de grande fonction (je suppose que je suis totalement dans le faux mais je ne demande qu'à progresser :-))"
un namespace regroupe les fonctions d'un même thème, une classe, c'est un nom commun, rarement un verbe... une classe parser, c'est pas bon... une classe html, ou chat, c'est correct :) chat::miauler(); fera miauler tout les chats, $minou->miauler(); fera miauler le chat nommé miauler... Bref, une classe, ça a plusieurs entrées et sorties, enfin, c'est mon point de vue... mais on a eu de nombreux débats sur ce sujet...
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 janv. 2007 à 11:31
@ audayls... isset() est un element de structure du langage, et non pas une fonction... tout comme echo, print, empty... il est très rapide à s'executer... .. .

@ jean84... il me semble que while/isset/preincrementation est plus rapide à s'executer que count/for... à bencher... .. .

@ tchaOo°
cs_chteuchteu Messages postés 4 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 30 janvier 2007
30 janv. 2007 à 08:03
Ah, ok...
Pourrais-tu me donner, si tu connais, une adresse de script qui sait faire ça ??
Merci encore !
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
29 janv. 2007 à 23:36
Voilà une nouvelle mise à jour :-)

@malalam : C'est vrai qu'avec le nombre de boucle qu'utilise mon code le temps d'execution doit être horriblement long mais à la base, ce code ne devrait s'executer qu'une fois avant d'enregistrer le texte. Ceci dit ce n'est pas une raison pour ne pas l'amélioré :-P.

@Chteuchteu : Ce code n'affiche pas en temps réel le code BBCode mais elle le corrige : dans l'exemple qui est donner "["http://www.google.fr" /i/b/u/b[b]bonjour]/b" donnera après une vérification "["http://www.google.fr" [b]bonjour]".

@Jean84 : "Du high level, hein Malalam ;-)" J'ose même pas la modifier celle là lol.
"et faire en sorte que la classe fasse le tri d'elle meme" J'aurais bien voulu mais comment savoir quels sont les couples ? Puisque toutes les balises ne sont pas de la forme "" "" (dû l'utilisation des expressions régulières)
Sinon pour la gestion d'erreur je verrais celà demain ;-)
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
29 janv. 2007 à 21:32
"J'ai voulu corrigé le problème mais j'ai vite arrêté car je me suis cassé les dents sur ce script auquel je ne comprennais pas grand chose XD"
lol ... est encore, celle la est plutot simple ^^ Mon plus grand moment de solitude, je crois que c'est avec http://www.phpcs.com/codes/PHP5-COLLECTION-UTILISATEURS-ITERATEURS-PHP_40403.aspx.
Du high level, hein Malalam ;-)

Pour les boucles, meme commentaires que Kankrelune avec un petit plus pour les boucles for(), plus rapide que les while(). Pour connaitre le nombre de case de ton tableau, utilise count().
Et pour l'incrementation, essaye de faire soit de la preincrementation, soit utilise $Var += _valeur_ . Sa permet de garder la meme forme tout le long du code en utilsiant differentes valeurs (question de gout evidement)

Pour la classe, si j'ai bien compris, il s'agit en fait d'un parser de bbcode ? Ne faudrait il pas a ce moment la eviter ce genre de commentaire :"La variable contenant les balises fermantes (qui doivent avoir les mêmes positions que les balises ouvrantes qui leurs correspondent)" et faire en sorte que la classe fasse le tri d'elle meme ?

Pour la gestion d'erreur, fait un tableau membre de ta classe et renvoi les valeurs de ce tableau (que tu auras rempli prealablement), cela te premettra de mettre fin a l'execution de la classe proprement et comme l'a souligne kankrelune, l'erreur sera gere par le code implementant ta classe.

@++
cs_chteuchteu Messages postés 4 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 30 janvier 2007
29 janv. 2007 à 19:03
Salut !
Je n'ai pas bien compris ce script...
J'ai un forums PHPBB (http://universsims2.free.fr/forum/)
Est-ce qu'il affiche en temps réel le code BB ???
Et si oui, comment l'intégrer dans mon forum ????
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
29 janv. 2007 à 19:02
@FhX : merci pour ton exemple je vais adapter ma classe sur ce fonctionnement :-).

@Kankrelune : Tu es sûr que "while(isset($monTableau[++$i]))" est plus rapide ? Car on utilise la fonction "isset" à chaque boucle alors que dans mon code on n'utilise qu'une seule fois la fonction "count" (Enfin si tu es certain, je vais changer çà il y a pas de problème c'étais juste pour ma culture personnelle ^^)

@Malalam : je vais revoir le code en prenant en compte vos remarques (d'ailleurs si vous avez d'autres remarques çà serait merveilleux ! lol)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
29 janv. 2007 à 15:02
Ouep... c'est lourd tout ça... déja...

plutot que de faire...

$i = 0;
$j = count($monTableau);
while ($i < $j)
{
// triatement sur $monTableau[$i]
$i++;
}

Sur un tableau indexé numériquement fais...

$i = -1;
while(isset($monTableau[++$i]))
{
// triatement sur $monTableau[$i]
}

D'ailleur d'une manière générale utilise la preincrementation... fais des comparaisons typées aussi quand tu peux... tu gagnera un peu en perf...

Tu ne devrais pas utiliser les die dans ta classe... son rôle n'est pas de gérer les erreurs... elle doit les stocker et tu doit gérer en dehor de ta classe l'action à faire en cas d'erreur... .. .

Après je pense qu'il y a moyen de simplifier le tout mais je n'ais que survolé le code... .. .

@ tchaOo°
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 janv. 2007 à 08:13
Hello,

et puis mon code a 2 ans d'âge, c'était pas forcément une bonne idée de le suivre à la lettre ;-)
Je l'avais oublié ce code d'ailleurs. L'idée était bonne, mais la réalisation, moins.
Je testerai ton code (sans prendre en compte les remarques justifiées de FhX, je veux juste voir le comportement).
Juste, mon code était nettement moins lourd, mais son traitement était pourtant très long...tu as fait des bench sur le tien ? C'est un des gros problèmes potentiels : le temps pour traiter ne serait-ce qu'un paragraphe. Faut faire gaffe à ça.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 janv. 2007 à 23:18
L'instanciation se fait via "new"
Quand tu fais : "$instance = new object();" , tu instancies la classe "object" dans $instance.


Une classe n'est pas une grande fonction. C'est un objet qui possède des propriétés et des méthodes.
Ex : Une classe "chaise".
Cette classe peut posséder plusieurs pieds, donc elle a une propriété "pieds".
On peut aussi déplacer la chaise, donc on va lui donner des coordonnées X et Y ainsi que le moyen de la déplacer.
Voici ce que donne mon exemple en code :

(je le fais en PHP5)
class chaise {
public $pieds = 0;
public $x = 0;
public $y = 0;

public function __construct($pieds) {
$this->pieds = $pieds;
}

public function BougeVers($x, $y) {
$this->x = $x;
$this->y = $y;
}

public function OuJeSuis() {
return 'Je suis à la position '.$this->x.','.$this->y.'.';
}

}

$ma_chaise_a_trois_pieds = new chaise(3);
$ma_chaise_a_quatre_pieds = new chaise(4);

$ma_chaise_a_quatre_pieds->BougeVers(10,5);
echo $ma_chaise_a_trois_pieds->OuJeSuis();
echo '
';
echo $ma_chaise_a_quatre_pieds->OuJeSuis();

// affichera :
/*
* Je suis à la position 0,0.
*
* Je suis à la position 10,5.
*/

Voila comment fonctionne un objet. Utilise cet exemple pour ta propre classe :)
audayls Messages postés 373 Date d'inscription samedi 9 juillet 2005 Statut Membre Dernière intervention 11 août 2008
28 janv. 2007 à 21:33
Salut FhX,
Je suivis le code de Malalam mais si tu trouves que je devrais l'orienté objet, je suis pas contre mais je ne sais pas comment faire :-P Pour moi une classe c'est une sorte de grande fonction (je suppose que je suis totalement dans le faux mais je ne demande qu'à progresser :-))

"Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)" Oui je sais c'est bien moi je fais tout de travers (que veux-tu c'est un don naturel XD)

Pour "Instancier" ma classe il suffirait que je la modifie pour qu'elle fonctionne de la façon que tu as décrite ?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 janv. 2007 à 21:14
"Aucune idée d'amélioration pour le moment ^^" "

Si, l'orientée objet.

Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)
Tu aurais du faire :

$string = new ta_classe('la chaine en bbcode a faire passer');
$string->correct_tags();
echo $string->tohtml();

Bref, ce que tu a fais ne ressemble à rien d'une classe.
C'est ce point la que tu dois revoir.
Rejoignez-nous