begin process at 2012 05 27 16:43:15
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > AMERABBCODE -VALIDER UN BBCODE (OU AUTRE)-

AMERABBCODE -VALIDER UN BBCODE (OU AUTRE)-


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :bbcode, correction, balise, classe, amera Niveau :Initié Date de création :28/01/2007 Date de mise à jour :28/05/2007 17:24:06 Vu / téléchargé :2 688 / 39

Auteur : audayls

Ecrire un message privé
Site perso
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

 Description

Bonjour à tous !

Cette classe est inspirée du code de Malalam (voir http://www.phpcs.com/code.aspx?ID=30110) qui permettait de corriger une chaîne contenant du BBCode. Mais cette classe ne fonctionnait pas entièrement. 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

J'ai donc entièrement reprogrammé cette classe pour obtenir ce résultat.

Si vous avez des remarques ou des améliorations à me proposer, je suis à votre écoute ;-)

Source

  • <?php
  • // Classe AmeraBBCode
  • // Auteur : Obimo (Site Web "www.audayls.123.fr")
  • // Classe basée sur la classe "verif_bb" de "Malalam" ("http://www.phpcs.com/code.aspx?ID=30110")
  • define('FILETAGS', 'filetags.xml');
  • class AmeraBBCode {
  • private $string = '';
  • private static $tags;
  • private $temp = array();
  • public function __construct($string) {
  • if (!isset(self::$tags)) $this->initialisetags();
  • $this->string = (string) $string;
  • }
  • private function checktags() {
  • $this->temp = $this->sortposition($this->temp, 'pos', 'asc');
  • $i = -1;
  • $open = array();
  • while (isset($this->temp[++$i])) {
  • if ($this->temp[$i]['delete'] === FALSE) {
  • if ($this->temp[$i]['open'] === TRUE) {
  • if (!isset($open[$this->temp[$i]['type']])) $open[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type']);
  • else {
  • $j = $i;
  • while (isset($this->temp[++$j]) AND ($this->temp[$j]['delete'] === TRUE OR $this->temp[$j]['open'] === TRUE OR $this->temp[$j]['type'] !== $this->temp[$i]['type']));
  • $this->temp[$i]['delete'] = TRUE;
  • $this->temp[$j]['delete'] = TRUE;
  • }
  • }
  • else {
  • $temp = end($open);
  • if ($temp === FALSE OR $this->temp[$i]['type'] !== $temp[1]) {
  • $j = $i;
  • while (isset($this->temp[++$j])) $this->temp[$j]['newpos'] -= $this->temp[$i]['strlen'];
  • $end = end($this->temp);
  • $this->temp[$i]['newpos'] = $end['newpos']+$end['strlen'];
  • $this->temp[] = $this->temp[$i];
  • unset($this->temp[$i]);
  • }
  • else unset($open[$temp[1]]);
  • }
  • }
  • }
  • }
  • public function correction() {
  • $this->searchtags();
  • $this->checktags();
  • $this->emptytags();
  • $this->save();
  • }
  • private function emptytags() {
  • $this->temp = $this->sortposition($this->temp, 'newpos', 'asc');
  • $i = -1;
  • $close = array();
  • $open = array();
  • while (isset($this->temp[++$i])) {
  • $endclose = end($close);
  • $endopen = end($open);
  • if ($this->temp[$i]['delete'] === FALSE) {
  • if ($this->temp[$i]['open'] === TRUE) {
  • if ($this->temp[$i]['newpos'] === $endclose[2] AND $this->temp[$i]['tag'] === $this->temp[$endclose[3]]['tag']) {
  • $this->temp[$i]['delete'] = TRUE;
  • $this->temp[$endclose[0]]['delete'] = TRUE;
  • }
  • else $open[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type'], 2 => $this->temp[$i]['newpos']+$this->temp[$i]['strlen']);
  • unset($close[$endclose[1]]);
  • }
  • else {
  • if ($this->temp[$i]['newpos'] === $endopen[2]) {
  • $this->temp[$i]['delete'] = TRUE;
  • $this->temp[$endopen[0]]['delete'] = TRUE;
  • }
  • else $close[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type'], 2 => $this->temp[$i]['newpos']+$this->temp[$i]['strlen'], 3 => $endopen[0]);
  • unset($open[$endopen[1]]);
  • }
  • }
  • else {
  • if ($endclose !== FALSE) $close[$endclose[1]][2] += $this->temp[$i]['strlen'];
  • if ($endopen !== FALSE) $open[$endopen[1]][2] += $this->temp[$i]['strlen'];
  • }
  • }
  • }
  • private function initialisetags() {
  • if (!is_file(FILETAGS)) throw new Exception('Le fichier tags de AmeraBBCode est introuvable.');
  • clearstatcache();
  • $xml = simplexml_load_file(FILETAGS);
  • if ($xml === FALSE) throw new Exception('Erreur dans le fichier de tags de AmeraBBCode.');
  • $i = -1;
  • while (isset($xml->tag[++$i])) {
  • if ((string) $xml->tag[$i]->code === 'TRUE') $code = TRUE;
  • else $code = FALSE;
  • if ((string) $xml->tag[$i]->delete === 'TRUE') $delete = TRUE;
  • else $delete = FALSE;
  • if ((string) $xml->tag[$i]->regex === 'TRUE') {
  • $regex = TRUE;
  • $xml->tag[$i]->open = preg_replace(array('`^\[`', '`\]$`'), array('\[', '\]'), (string) $xml->tag[$i]->open);
  • }
  • else $regex = FALSE;
  • self::$tags[] = array('open' => (string) $xml->tag[$i]->open, 'close' => (string) $xml->tag[$i]->close, 'code' => FALSE, 'delete' => $delete, 'regex' => $regex);
  • }
  • }
  • private function save() {
  • $tempdesc = $this->sortposition($this->temp, 'pos', 'desc');
  • $i = -1;
  • while (isset($tempdesc[++$i])) $this->string = substr_replace($this->string, '', $tempdesc[$i]['pos'], $tempdesc[$i]['strlen']);
  • $i = -1;
  • $temp = 0;
  • while (isset($this->temp[++$i])) {
  • if ($this->temp[$i]['delete'] === TRUE) $temp += $this->temp[$i]['strlen'];
  • else $this->string = substr_replace($this->string, $this->temp[$i]['tag'], $this->temp[$i]['newpos']-$temp, 0);
  • }
  • }
  • private function searchtags() {
  • $i = -1;
  • while (isset(self::$tags[++$i])) {
  • $countopen = 0;
  • $countclose = 0;
  • $open = array();
  • $close = array();
  • if (self::$tags[$i]['regex'] === TRUE) {
  • preg_match_all('`'.self::$tags[$i]['open'].'`', $this->string, $temp);
  • $j = -1;
  • $pos = -1;
  • while (isset($temp[0][++$j])) {
  • $pos = strpos($this->string, $temp[0][$j], $pos+1);
  • $open[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'open' => TRUE, 'pos' => $pos, 'strlen' => strlen($temp[0][$j]), 'tag' => $temp[0][$j], 'type' => $i);
  • $countopen++;
  • }
  • }
  • else {
  • $pos = -1;
  • $strlen = strlen(self::$tags[$i]['open']);
  • do {
  • $pos = strpos($this->string, self::$tags[$i]['open'], $pos+1);
  • if ($pos !== FALSE) {
  • $open[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'open' => TRUE, 'pos' => $pos, 'strlen' => $strlen, 'tag' => self::$tags[$i]['open'], 'type' => $i);
  • $countopen++;
  • }
  • } while ($pos !== FALSE);
  • }
  • $pos = -1;
  • $strlen = strlen(self::$tags[$i]['close']);
  • do {
  • $pos = strpos($this->string, self::$tags[$i]['close'], $pos+1);
  • if ($pos !== FALSE) {
  • $close[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'pos' => $pos, 'open' => FALSE, 'strlen' => $strlen, 'tag' => self::$tags[$i]['close'], 'type' => $i);
  • $countclose++;
  • }
  • } while ($pos !== FALSE);
  • $j = -1;
  • while (isset($close[++$j]) AND isset($open[0]) AND $close[$j]['pos'] < $open[0]['pos']) {
  • $close[$j]['delete'] = TRUE;
  • $countclose--;
  • }
  • while ($countclose !== $countopen) {
  • if ($countclose > $countopen) {
  • $close[$countclose-1]['delete'] = TRUE;
  • $countclose--;
  • }
  • else {
  • $open[$countopen-1]['delete'] = TRUE;
  • $countopen--;
  • }
  • }
  • $this->temp = array_merge($this->temp, $open, $close);
  • }
  • }
  • public function showstring() {
  • return $this->string;
  • }
  • private function sortposition($array, $by, $order) {
  • $endval = end($array);
  • $vals = array_keys($endval);
  • foreach ($vals as $init){
  • $keyname = $init;
  • $$keyname = array();
  • }
  • foreach ($array as $key => $row) {
  • foreach ($vals as $names){
  • $keyname = $names;
  • $test = array();
  • $test[$key] = $row[$names];
  • $$keyname = array_merge((array) $$keyname,(array) $test);
  • }
  • }
  • if ($order === 'asc') array_multisort($$by,SORT_ASC, SORT_NUMERIC,$array);
  • else array_multisort($$by,SORT_DESC, SORT_NUMERIC,$array);
  • return $array;
  • }
  • }
  • try {
  • $string = '[url="http://www.google.com"][b][url="http://www.google.fr"][/i][/b][/i][/b][code="php"]Code ![/code][/u][/b][b]Salut[/b][b][i][i][b]bonjour[/url][/i][/b][/b][b][/i][/url]';
  • $time = microtime(TRUE);
  • $AmeraBBCode = new AmeraBBCode($string);
  • $AmeraBBCode->correction();
  • echo 'Chaîne d\'origine : ',$string,"<br />\n";
  • echo 'Chaîne corrigée : ',$AmeraBBCode->showstring();
  • }
  • catch (Exception $e) {
  • die ($e->getmessage());
  • }
  • ?>
<?php
// Classe AmeraBBCode
// Auteur : Obimo (Site Web "www.audayls.123.fr")
// Classe basée sur la classe "verif_bb"  de "Malalam" ("http://www.phpcs.com/code.aspx?ID=30110")

define('FILETAGS', 'filetags.xml');

class AmeraBBCode {
	private $string = '';
	private static $tags;
	private $temp = array();

	public function __construct($string) {
		if (!isset(self::$tags)) $this->initialisetags();
		$this->string = (string) $string;
	}

	private function checktags() {
		$this->temp = $this->sortposition($this->temp, 'pos', 'asc');
		$i = -1;
		$open = array();
		while (isset($this->temp[++$i])) {
			if ($this->temp[$i]['delete'] === FALSE) {
				if ($this->temp[$i]['open'] === TRUE) {
					if (!isset($open[$this->temp[$i]['type']])) $open[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type']);
					else {
						$j = $i;
						while (isset($this->temp[++$j]) AND ($this->temp[$j]['delete'] === TRUE OR $this->temp[$j]['open'] === TRUE OR $this->temp[$j]['type'] !== $this->temp[$i]['type']));
						$this->temp[$i]['delete'] = TRUE;
						$this->temp[$j]['delete'] = TRUE;
					}
				}
				else {
					$temp = end($open);
					if ($temp === FALSE OR $this->temp[$i]['type'] !== $temp[1]) {
						$j = $i;
						while (isset($this->temp[++$j])) $this->temp[$j]['newpos'] -= $this->temp[$i]['strlen'];
						$end = end($this->temp);
						$this->temp[$i]['newpos'] = $end['newpos']+$end['strlen'];
						$this->temp[] = $this->temp[$i];
						unset($this->temp[$i]);
					}
					else unset($open[$temp[1]]);
				}
			}
		}
	}

	public function correction() {
		$this->searchtags();
		$this->checktags();
		$this->emptytags();
		$this->save();
	}
	
	private function emptytags() {
		$this->temp = $this->sortposition($this->temp, 'newpos', 'asc');
		$i = -1;
		$close = array();
		$open = array();
		while (isset($this->temp[++$i])) {
			$endclose = end($close);
			$endopen = end($open);
			if ($this->temp[$i]['delete'] === FALSE) {
				if ($this->temp[$i]['open'] === TRUE) {
					if ($this->temp[$i]['newpos'] === $endclose[2] AND $this->temp[$i]['tag'] === $this->temp[$endclose[3]]['tag']) {
						$this->temp[$i]['delete'] = TRUE;
						$this->temp[$endclose[0]]['delete'] = TRUE;
					}
					else $open[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type'], 2 => $this->temp[$i]['newpos']+$this->temp[$i]['strlen']);
					unset($close[$endclose[1]]);
				}
				else {
					if ($this->temp[$i]['newpos'] === $endopen[2]) {
						$this->temp[$i]['delete'] = TRUE;
						$this->temp[$endopen[0]]['delete'] = TRUE;
					}
					else $close[$this->temp[$i]['type']] = array(0 => $i, 1 => $this->temp[$i]['type'], 2 => $this->temp[$i]['newpos']+$this->temp[$i]['strlen'], 3 => $endopen[0]);
					unset($open[$endopen[1]]);
				}
			}
			else {
				if ($endclose !== FALSE) $close[$endclose[1]][2] += $this->temp[$i]['strlen'];
				if ($endopen !== FALSE) $open[$endopen[1]][2] += $this->temp[$i]['strlen'];
			}
		}
	}

	private function initialisetags() {
		if (!is_file(FILETAGS)) throw new Exception('Le fichier tags de AmeraBBCode est introuvable.');
		clearstatcache();
		$xml = simplexml_load_file(FILETAGS);
		if ($xml === FALSE) throw new Exception('Erreur dans le fichier de tags de AmeraBBCode.');
		$i = -1;
		while (isset($xml->tag[++$i])) {
			if ((string) $xml->tag[$i]->code === 'TRUE') $code = TRUE;
			else $code = FALSE;
			if ((string) $xml->tag[$i]->delete === 'TRUE') $delete = TRUE;
			else $delete = FALSE;
			if ((string) $xml->tag[$i]->regex === 'TRUE') {
				$regex = TRUE;
				$xml->tag[$i]->open = preg_replace(array('`^\[`', '`\]$`'), array('\[', '\]'), (string) $xml->tag[$i]->open);
			}
			else $regex = FALSE;
			self::$tags[] = array('open' => (string) $xml->tag[$i]->open, 'close' => (string) $xml->tag[$i]->close, 'code' => FALSE, 'delete' => $delete, 'regex' => $regex);
		}
	}

	private function save() {
		$tempdesc = $this->sortposition($this->temp, 'pos', 'desc');
		$i = -1;
		while (isset($tempdesc[++$i])) $this->string = substr_replace($this->string, '', $tempdesc[$i]['pos'], $tempdesc[$i]['strlen']);
		$i = -1;
		$temp = 0;
		while (isset($this->temp[++$i])) {
			if ($this->temp[$i]['delete'] === TRUE) $temp += $this->temp[$i]['strlen'];
			else $this->string = substr_replace($this->string, $this->temp[$i]['tag'], $this->temp[$i]['newpos']-$temp, 0);
		}
	}

	private function searchtags() {
		$i = -1;
		while (isset(self::$tags[++$i])) {
			$countopen = 0;
			$countclose = 0;
			$open = array();
			$close = array();
			if (self::$tags[$i]['regex'] === TRUE) {
				preg_match_all('`'.self::$tags[$i]['open'].'`', $this->string, $temp);
				$j =  -1;
				$pos = -1;
				while (isset($temp[0][++$j])) {
					$pos = strpos($this->string, $temp[0][$j], $pos+1);
					$open[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'open' => TRUE, 'pos' => $pos, 'strlen' => strlen($temp[0][$j]), 'tag' => $temp[0][$j], 'type' => $i);
					$countopen++;
				}
			}
			else {
				$pos = -1;
				$strlen = strlen(self::$tags[$i]['open']);
				do {
				    $pos = strpos($this->string, self::$tags[$i]['open'], $pos+1);
					if ($pos !== FALSE) {
						$open[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'open' => TRUE, 'pos' => $pos, 'strlen' => $strlen, 'tag' => self::$tags[$i]['open'], 'type' => $i);
						$countopen++;
					}
				} while ($pos !== FALSE);
			}
			$pos = -1;
			$strlen = strlen(self::$tags[$i]['close']);
			do {
				$pos = strpos($this->string, self::$tags[$i]['close'], $pos+1);
				if ($pos !== FALSE) {
					$close[] = array('delete' => self::$tags[$i]['delete'], 'newpos' => $pos, 'pos' => $pos, 'open' => FALSE, 'strlen' => $strlen, 'tag' => self::$tags[$i]['close'], 'type' => $i);
					$countclose++;
				}
			} while ($pos !== FALSE);
			$j = -1;
			while (isset($close[++$j]) AND isset($open[0]) AND $close[$j]['pos'] < $open[0]['pos']) {
				$close[$j]['delete'] = TRUE;
				$countclose--;
			}
			while ($countclose !== $countopen) {
				if ($countclose > $countopen) {
					$close[$countclose-1]['delete'] = TRUE;
					$countclose--;
				}
				else {
					$open[$countopen-1]['delete'] = TRUE;
					$countopen--;
				}
			}
			$this->temp = array_merge($this->temp, $open, $close);
		}
	}

	public function showstring() {
		return $this->string;
	}

	private function sortposition($array, $by, $order) {
		$endval = end($array);
		$vals = array_keys($endval);
		foreach ($vals as $init){
			$keyname = $init;
			$$keyname = array();
		}
		foreach ($array as $key => $row) {
			foreach ($vals as $names){
				$keyname = $names;
				$test = array();
				$test[$key] = $row[$names];
				$$keyname = array_merge((array) $$keyname,(array) $test);
			}
		}
		if ($order === 'asc') array_multisort($$by,SORT_ASC, SORT_NUMERIC,$array);
		else array_multisort($$by,SORT_DESC, SORT_NUMERIC,$array);
		return $array;
	}

}

try {
	$string = '[url="http://www.google.com"][b][url="http://www.google.fr"][/i][/b][/i][/b][code="php"]Code ![/code][/u][/b][b]Salut[/b][b][i][i][b]bonjour[/url][/i][/b][/b][b][/i][/url]';
	$time = microtime(TRUE);
	$AmeraBBCode = new AmeraBBCode($string);
	$AmeraBBCode->correction();
	echo 'Chaîne d\'origine : ',$string,"<br />\n";
	echo 'Chaîne corrigée : ',$AmeraBBCode->showstring();
}
catch (Exception $e) {
	die ($e->getmessage());
}

?>

 Conclusion

La prochaine mise à jour ajoutera la prise en compte des balises "code" (les balises encadrées par ces balises ne seront pas analysées).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 janvier 2007 15:17:47 :
Correction d'une erreur et amélioration de la classe : * si il y a plusieurs balises du même types qui s'enchaînent, elles seront supprimées. * si un couple de balises n'encadrent rien, il sera supprimé.
28 janvier 2007 18:16:30 :
Ajout des expressions régulières.
28 janvier 2007 18:18:33 :
Ajout d'un exemple d'utilisation.
28 janvier 2007 21:42:04 :
J'espère que celà ressemble un peu plus à une classe :-P
29 janvier 2007 23:25:29 :
Amélioration générale : *Celà devrait enfin ressembler à une classe (du moins j'ai fait ce que j'ai compris XD) => Merci à FhX. *Utilisation de la preincrementation => Merci à Kankrelune. *Les expressions régulières peuvent être utilisé plus facilement.
02 mars 2007 20:57:50 :
Amélioration générale : *Correction corrigé (normalement :-P) *Plus de facilité à modifier les tags => Merci de nouveau à FhX pour son exelente idée :-) *Insertion d'une option permettant de gerer une balise "code" (si il y a des balises entre cette balise elles ne seront pas analysées)
02 mars 2007 21:26:44 :
Code mal passé :-P
02 mars 2007 21:28:54 :
Décidement c'est pas le bon moment pour sortir la mise à jour ...
28 mai 2007 17:24:06 :
=> "28/05/07" Amélioration générale : *Classe PHP5. *Gestion des Tags en XML.

 Sources du même auteur

Source avec Zip CLASS DE COULEUR

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip TESTS UNITAIRES par pierreSabatier
Source avec une capture CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ) par demonstorm
CLASSE MYSQL UTILISANT LES FONCTIONS PDO par Vince66
FORMULAIRE BBCODE AVEC PASSAGE EN HTML par Seby63
Source avec Zip CLASS DE BBCODE ENTIÈREMENT PARAMÉTRABLE par the_angel

Commentaires et avis

Commentaire de FhX le 28/01/2007 21:14:30

"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.

Commentaire de audayls le 28/01/2007 21:33:09

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 ?

Commentaire de FhX le 28/01/2007 23:18:21

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 '<br/>';
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 :)

Commentaire de malalam le 29/01/2007 08:13:44 administrateur CS

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.

Commentaire de kankrelune le 29/01/2007 15:02:59

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°

Commentaire de audayls le 29/01/2007 19:02:18

@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)

Commentaire de chteuchteu le 29/01/2007 19:03:06

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 ????

Commentaire de jean84 le 29/01/2007 21:32:58

"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.

@++

Commentaire de audayls le 29/01/2007 23:36:35

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 "[url="http://www.google.fr"][/i][/b][/u][/b][b][i][b]bonjour[/url][/i][/b][/b][b]" donnera après une vérification "[url="http://www.google.fr"][b][i]bonjour[/i][/b][/url]".

@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 "[b]" "[/b]" (dû l'utilisation des expressions régulières)
Sinon pour la gestion d'erreur je verrais celà demain ;-)

Commentaire de chteuchteu le 30/01/2007 08:03:02

Ah, ok...
Pourrais-tu me donner, si tu connais, une adresse de script qui sait faire ça ??
Merci encore !

Commentaire de kankrelune le 30/01/2007 11:31:40

@ 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°

Commentaire de coucou747 le 30/01/2007 17:08:07 administrateur CS

"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...

Commentaire de jean84 le 30/01/2007 17:25:23

@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.

@++

Commentaire de kankrelune le 31/01/2007 13:11:55

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°

Commentaire de audayls le 31/01/2007 13:38:36

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

Commentaire de FhX le 31/01/2007 19:06:46

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' => '[b]', 'close' => '[/b]'),
             array('open' => '[u]', 'close' => '[/u]'),
             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 :)

Commentaire de audayls le 01/02/2007 19:04:42

Exelente ton idée ! Je vais essayé d'adapter tout çà ;-)

Commentaire de audayls le 28/05/2007 17:26:56

Source mise à jour ^^ (Si cela interesse encore quelqu'un XD)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Iframe [ par saad123 ] Salut je voudrais savoir comment je pourrai remplacer la balise iframe par une autre balise equivalente parceque celle pose probleme avec certain navi probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc balise, cache :( [ par elanspeech ] Bonjour,J'utilise la balise suivante :&lt;embed src="fichier.wav" width=145 height=25 autostart="false" cache="false" controls="controlpanel"&gt;fichi template.inc [ par joedalton ] bonjourVoila, je possede un fichier template.inc qui me permet de définir ma classe template, mais le probleme c'est que ce fichier est valable pour l lien dans une balise textaera [ par ludlu ] je n'arrive pas a afficher un lien dans une balise de type textaera. voici mon code:$Mesure_effectue="&lt;a href=\"Choix_freq1.php\"&gt;Select * from Inversion de matrice [ par VanSama ] Bonjours, pour les besoins d'analyse d'une image, je recherche un algorithme de d'inversion d'une matrice NxN.J'ai lue beaucoup de chose sur le site d Quand on parle de Classe [ par Tomcube ] C'est une question très vaste,On parle de plus en plus de programmation objet. Qui dit programmation objet dit classe. D'ailleurs, c'est fou le nombre problème de classe [ par guixyz ] Hello! Voila je suis en train d'apprendre a me servir des classes en php. Et j'en ai fait une pour gérer mes formulaires Donc j'ai ma classe, une fcti Pb avec classe en php, Affichage [ par matou82 ] Je voudrais savoir comment surcharger l'affichage d' echo ou print pour une classePour avoir:$obj = new Maclass;echo $obj;Cela affiche : "Object" Je s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales