Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/12/2011, 17h01   #1
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

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

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
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 :
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
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h03   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
fait qu'un seul preg replace, et le

Code :
 str_replace(array("\n"), array('<br />'),$synopsis);
fait plutôt un nl2br
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 09h47   #3
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

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

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Bonjour, j'ai appliqué suivant vos conseils :
Code :
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 :
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
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 09h48   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
y'a déjà plein de lib de BBCode pourquoi en récréer une ?
même une extension PHP
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 10h00   #5
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

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

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Ben j'utilise tinymce pour le bbcode donc je me plie au balisage
Il me manque uniquement :
Code :
1
2
 
[color = #888888]tendre[ /color ]
A transformer comme ceci:
Code :
<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 :
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
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h38   #6
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

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

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
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 :
~\[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)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 13h45   #7
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

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

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
merci je pense avoir construit quelque chose de sympathique sous forme de classe.
Code :
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 :
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 :
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
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h18.


 
 
 
 
Partenaires

Hébergement Web