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 :

Optimiser les performances du BBCode [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut Optimiser les performances du BBCode
    Bonjour, je suis entrain de créer un genre de bbcode (en test).
    Mais je me pose certaine question en terme de performance, je n'ai pas encore optimisé sa dans une classe mais l'utilisation de tel ou tel fonction son très importante (pour le moment php 5.2 mais on va upgrader).
    Donc ma question comment puis je améliorer mon code (peut être remplacer preg_replace par autre chose), les données sont assez importante donc je dois faire cette analyse d'entrée de jeu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $synopsis = $data['m_synopsis'];
    $synopsis = preg_replace('#\[b](.*?)\[/b\]#smx', '<strong>$1</strong>', $synopsis);
    $synopsis = preg_replace('#\[i](.*?)\[/i\]#smx', '<i>$1</i>', $synopsis);
    $synopsis = str_replace(array("\n"), array('<br />'),$synopsis);
    Pour l'instant le bbcode est assez basique mais je pense peut être construire mon propre balisage (on verra en son temps), mais mes regex sont elles optimisées, le type de fonction également ?
    Merci
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    fait qu'un seul preg replace, et le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     str_replace(array("\n"), array('<br />'),$synopsis);
    fait plutôt un nl2br

  3. #3
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Bonjour, j'ai appliqué suivant vos conseils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $patterns = array('#\[b](.*?)\[/b\]#smx','#\[i](.*?)\[/i\]#smx');
    $replace = array('<strong>$1</strong>','<i>$1</i>');
    $synopsis = preg_replace($patterns, $replace, nl2br($data['m_synopsis']));
    Sa fonctionne très bien mais je me pose certaine question sur les regex à appliquer.
    Par exemple j'ai la balise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [color = #888888]tendre[ /color ]
    Quel genre de regex dois je appliquer pour une tel balise.
    PS: j'ai intentionnellement fais des espaces pour ne pas que le forum l’interprète
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    y'a déjà plein de lib de BBCode pourquoi en récréer une ?
    même une extension PHP

  5. #5
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Ben j'utilise tinymce pour le bbcode donc je me plie au balisage
    Il me manque uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [color = #888888]tendre[ /color ]
    A transformer comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span style="color:#888888">tendre</span>
    Mais je n'ai pas trouver de lib bbcode pourtant j'ai bien regarder, dans mon cas j'ai pas besoin d'écrire une lib un peu de modification par ci par la pour avoir quelques choses de propre

    J'ai essayer avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // ma regex pour la balise color:
    #\[color*=?s*(#[[:xdigit:]]{6})](.*?)[/\color]#smx
    //La balise de remplacement
    <span style="color:$1;">$2</span>
    Sa ne fonctionne pas
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Attention, tu ne peux pas utiliser # comme délimiteur sans l'échapper dans l'expression. Et je pense que tu n'as pas besoin de doubles [] autour de :xdigit:
    Donc quelque chose comme ça, peut-être : (non testé)
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    ~\[color*=?s*(#[:xdigit:]{6})\](.*?)\[\\color\]~smx
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    merci je pense avoir construit quelque chose de sympathique sous forme de classe.
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    class bbcode{
    	/**
    	 * @static
    	 * @var $default_color
    	 */
    	private static $default_color = array(
    		'red','green','blue','yellow','purple','olive'
    	);
    	/**
    	 * Retourne les couleurs à remplacer
    	 * @param array $new_color
    	 * @throws Exception
    	 * @return string
    	 */
    	private function colorString(array $new_color=null){
    		if($new_color != null){
    			if(is_array($new_color)){
    				$tabs = array_merge((array) self::$default_color,(array) $new_color);
    			}else{
    				throw new Exception('new_color is not array');
    			}
    		}else{
    			$tabs = self::$default_color;
    		}
    		return implode('|', $tabs);
    	}
    	/**
    	 * Les regex pour le remplacement des bbcode
    	 * @param $new_color
    	 */
    	private function regPattern($new_color){
    		return array(
    			'/\[b](.+?)\[\/b\]/i','/\[i](.+?)\[\/i\]/i',
    			'/\[u](.+?)\[\/u\]/i',
    			'/\[color=('.self::colorString($new_color).'|#[[:xdigit:]]{6})\](.+?)\[\/color\]/i',
    			'/\[quote\](.+?)\[\/quote\]/i',
    			'/\[url=(.+?)\](.+?)\[\/url\]/i'
    		);
    	}
    	/**
    	 * Les balises html qui remplace le bbcode pour l'affichage
    	 * @param bool $clear
    	 */
    	private function strHtml($clear=false){
    		if($clear == true){
    			$pattern = array(
    				'$1','$1','$1','$2','$1','$2'
    			);
    		}else{
    			$pattern = array(
    					'<strong>$1</strong>',
    					'<span style="font-style:italic;">$1</span>',
    					'<span style="text-decoration:underline;">$1</span>',
    					'<span style="color:$1;">$2</span>',
    					'$1',
    					'$2'
    			);
    		}
    		return $pattern;
    	}
    	/**
    	 * Fonction qui effectue la conversion du bbcode=>html
    	 * @param string $string
    	 * @param array $str_option
    	 */
    	public static function html_convert($string,$str_option=array('linebreaks'=>true,'clear'=>false,'new_color'=>null)){
    		if($string != null OR ($string != '')){
    			if($str_option['linebreaks']!=false){
    				$lb = nl2br($string);
    			}else{
    				$lb = $string;
    			}
    			return preg_replace(self::regPattern($str_option['new_color']), self::strHtml($str_option['clear']), $lb);
    		}else{
    			return $string;
    		}
    	}
    }
    Pour l'utiliser suffit de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bbcode::html_convert($mystring);
    Sous sa forme plus complète avec des paramètres en plus ainsi qu'une couleur supplémentaire dans le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bbcode::html_convert(
    	$mystring,
    	array(
    		'linebreaks'=>true,
    		'clear'=>false,
    		'new_color'=>array('darkgreen')
    	)
    );
    Je la complète au fur et à mesure, j'ai fais des tests d’exécution c'est très rapide
    Je vais l'ajouter dans ma lib histoire d'aider les autres
    Au petit déjeuner, je prend du PHP et au souper du jQuery.
    AFUP 2009 : Bien optimiser son code pour le référencement
    Mon projet open source de librairie PHP 5: magix cjquery

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

Discussions similaires

  1. Optimiser les performances try/catch ?
    Par KiLVaiDeN dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2014, 13h47
  2. Réponses: 0
    Dernier message: 02/04/2010, 09h09
  3. Réponses: 4
    Dernier message: 02/09/2009, 16h31
  4. Comment optimiser les performances de mon PC ?
    Par Celebrate dans le forum Windows XP
    Réponses: 6
    Dernier message: 16/07/2008, 22h08
  5. Réponses: 16
    Dernier message: 04/07/2008, 08h54

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