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 28/02/2011, 12h51   #1
 
Inscription : janvier 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 43
Points : -9
Points : -9
Par défaut regex par block

bonjour,

imaginon que j'ai un texte composer de trois paragraphe

[codehtml]blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla[/codehtml]

[codejs]lollollollollollollollollollollollollollollollollollollollollollollollollollollollollollollollol[/codejs]

[codephp]mdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdr[/codephp]

et que le texte entre les balise [codehtml] execute ceci :
$texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<strong>$1</strong>', $texte);
et que le texte entre les balise [codejs] execute ceci :
$texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<em>$1</em>', $texte);
et que le texte entre les balise [codephp] execute ceci :
$texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<u>$1</u>', $texte);
sourcilpower est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 28/02/2011, 13h01   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Hello.

D'accord, si tu le dis.

C'est quoi la question ? Dans mon pays on termine les phrases interrogatives par un point d'interrogation.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 28/02/2011, 13h06   #3
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Professeur des Ecoles
Secteur : Enseignement

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Pourquoi avoir ouvert un nouveau post ?
N'est-ce pas la suite de celui-ci ?

Un texte qui exécute du code php ?
Il me semble que cela mérite clarification.

Fred
micetf est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 28/02/2011, 13h13   #4
 
Inscription : janvier 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 43
Points : -9
Points : -9
Citation:
Envoyé par Benjamin Delespierre Voir le message
Hello.

D'accord, si tu le dis.

C'est quoi la question ? Dans mon pays on termine les phrases interrogatives par un point d'interrogation.
La question est comment puis-je faire ? svp
sourcilpower est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 28/02/2011, 13h18   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Avec ce que tu nous as donné comme information on ne peut pas te dire comment faire: tu ne nous décrit pas ce que tu veux faire.

Citation:
et que le texte entre les balise [codehtml] execute ceci : ...
N'est pas un explication valide.
C'est comme si je disait: "Voiture, bannane ! Comment faire ?"

Je pense que tu voulais dire "Je souhaite encapsuler des portions de texte entre des balises à l'aide d'expression régulières." Je me trompe ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 13h35   #6
 
Inscription : janvier 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 43
Points : -9
Points : -9
Par défaut re

Citation:
Envoyé par Benjamin Delespierre Voir le message
Avec ce que tu nous as donné comme information on ne peut pas te dire comment faire: tu ne nous décrit pas ce que tu veux faire.


N'est pas un explication valide.
C'est comme si je disait: "Voiture, bannane ! Comment faire ?"

Je pense que tu voulais dire "Je souhaite encapsuler des portions de texte entre des balises à l'aide d'expression régulières." Je me trompe ?
je vais m'exprimer plus clairement avec un exemple :

voici mon texte :

Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].

et j'aimerais que le texte entre les balise [lol][/lol] :
- on remplace les balise [bb][/bb] par <strong></strong>
- on remplace les balise [ii][/ii] par <em></em>

et j'aimerais que le texte entre les balise [mdr][/mdr] :
- on remplace les balise [bb][/bb] par <em></em>
- on remplace les balise [ii][/ii] par <strong></strong>

... Merci d'avance
sourcilpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 13h54   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Ah d'accord, tu veux faire ton propre bbcode en fait.

C'est relativement simple à faire, s'il ne s'agit que de "traduire" les balises bb par des balises XHTML.
On va pour ça se servir d'un tableau associatif qui nous fournira cette traduction:

Code :
1
2
3
4
5
6
 
$bb_tags = array(
'a' => 'em',
'b' => 'strong',
'c' => 'center'
);
On va ensuite se servir de ce tableau pour faire les traductions qui vont bien:
Code :
1
2
3
4
5
6
7
 
// On construit les patterns de remplacement
$bb_patterns = array_map(function ($item) { return "#\[$item\](.*)\[/$item\]#im"; }, array_keys($bb_tags));
var_dump($bb_patterns);
 
$bb_replace = array_map(function ($item) { return "<$item>$1</$item>"; }, array_values($bb_tags));
var_dump($bb_replace);
Les var_dump nous servent à voir que nos patterns de traduction sont corrects:
Code :
1
2
3
4
5
6
7
8
9
10
 
array
  0 => string '#\[a\](.*)\[/a\]#im' (length=19)
  1 => string '#\[b\](.*)\[/b\]#im' (length=19)
  2 => string '#\[c\](.*)\[/c\]#im' (length=19)
 
array
  0 => string '<em>$1</em>' (length=11)
  1 => string '<strong>$1</strong>' (length=19)
  2 => string '<center>$1</center>' (length=19)
ensuite, y'a plus qu'a appliquer tout ça sur une chaine:
Code :
1
2
3
4
5
6
$text = <<<TXT
[c][a]hello[/a] world[/c]
TXT;

var_dump(preg_replace($bb_patterns, $bb_replace, $text));
Et voilà le résultat:
Code :
1
2
 
string '<center><em>hello</em> <strong>world</strong></center>' (length=54)
C'est tout bête
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 14h13   #8
 
Inscription : janvier 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 43
Points : -9
Points : -9
Citation:
Envoyé par Benjamin Delespierre Voir le message
Ah d'accord, tu veux faire ton propre bbcode en fait.

C'est relativement simple à faire, s'il ne s'agit que de "traduire" les balises bb par des balises XHTML.
On va pour ça se servir d'un tableau associatif qui nous fournira cette traduction:

Code :
1
2
3
4
5
6
 
$bb_tags = array(
'a' => 'em',
'b' => 'strong',
'c' => 'center'
);
On va ensuite se servir de ce tableau pour faire les traductions qui vont bien:
Code :
1
2
3
4
5
6
7
 
// On construit les patterns de remplacement
$bb_patterns = array_map(function ($item) { return "#\[$item\](.*)\[/$item\]#im"; }, array_keys($bb_tags));
var_dump($bb_patterns);
 
$bb_replace = array_map(function ($item) { return "<$item>$1</$item>"; }, array_values($bb_tags));
var_dump($bb_replace);
Les var_dump nous servent à voir que nos patterns de traduction sont corrects:
Code :
1
2
3
4
5
6
7
8
9
10
 
array
  0 => string '#\[a\](.*)\[/a\]#im' (length=19)
  1 => string '#\[b\](.*)\[/b\]#im' (length=19)
  2 => string '#\[c\](.*)\[/c\]#im' (length=19)
 
array
  0 => string '<em>$1</em>' (length=11)
  1 => string '<strong>$1</strong>' (length=19)
  2 => string '<center>$1</center>' (length=19)
ensuite, y'a plus qu'a appliquer tout ça sur une chaine:
Code :
1
2
3
4
5
6
$text = <<<TXT
[c][a]hello[/a] world[/c]
TXT;

var_dump(preg_replace($bb_patterns, $bb_replace, $text));
Et voilà le résultat:
Code :
1
2
 
string '<center><em>hello</em> <strong>world</strong></center>' (length=54)
C'est tout bête

je ne suis que debutant donc desoler mais je n'est vraiment rien compris :s
sourcilpower est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 14h23   #9
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Professeur des Ecoles
Secteur : Enseignement

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Citation:
Je ne suis que débutant donc désolé mais je n'ai vraiment rien compris :s
Alors pour commencer, peut-être que ceci fera l'affaire ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
$texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
 
// Je remplace les balises bb comprises entre des balises lol
$texte = preg_replace('#(\[lol\].*)\[bb\](.*?)\[/bb\](.*\[/lol\])#', '$1<strong>$2</strong>$3', $texte);
// Je remplace les balises ii comprises entre des balises lol et je supprime les balises lol
$texte = preg_replace('#\[lol\](.*)\[ii\](.*?)\[/ii\](.*)\[/lol\]#', '$1<em>$2</em>$3', $texte);
 
// Je remplace les balises bb comprises entre des balises mdr
$texte = preg_replace('#(\[mdr\].*)\[bb\](.*?)\[/bb\](.*\[/mdr\])#', '$1<strong>$2</strong>$3', $texte);
// Je remplace les balises ii comprises entre des balises mdr et je supprime les balises mdr
$texte = preg_replace('#\[mdr\](.*)\[ii\](.*?)\[/ii\](.*)\[/mdr\]#', '$1<em>$2</em>$3', $texte);
echo $texte;
Mais, pour généraliser, il me semble pas inutile de se pencher sur la proposition de Benjamin.

Fred
micetf est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 14h35   #10
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Il faut toujours généraliser au maximum pour faciliter la maintenance. Aujourd'hui tu as besoin de 3 ou 4 balises mais quand il va falloir en rajouter tu vas faire quoi ? à chaque fois tu vas te replonger dans le code pour ajouter des fonctionnalités ?

La mécanique que je t'ai fournie utilise un tableau associatif pour connaitre les balises à remplacer et par quoi les remplacer. Par exemple 'a' => 'em' signifie qu'on rempalce [a] [/a] par <em> </em>.
Seulement, on ne peut pas l'utiliser tel quel, c'est pour ça que je fais parcourir les clés et les valeurs du tableau de traduction pour fabriquer les éléments de remplacement qui seront in fine utilisé par la fonction preg_replace.
A terme, tu pourra mettre ce tableau de traduction dans un fichier ini par exemple et tu pourra ajouter de nouvelles balises sans toucher au code.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 14h40   #11
 
Inscription : janvier 2011
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 43
Points : -9
Points : -9
Citation:
Envoyé par micetf Voir le message
Alors pour commencer, peut-être que ceci fera l'affaire ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
$texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
 
// Je remplace les balises bb comprises entre des balises lol
$texte = preg_replace('#(\[lol\].*)\[bb\](.*?)\[/bb\](.*\[/lol\])#', '$1<strong>$2</strong>$3', $texte);
// Je remplace les balises ii comprises entre des balises lol et je supprime les balises lol
$texte = preg_replace('#\[lol\](.*)\[ii\](.*?)\[/ii\](.*)\[/lol\]#', '$1<em>$2</em>$3', $texte);
 
// Je remplace les balises bb comprises entre des balises mdr
$texte = preg_replace('#(\[mdr\].*)\[bb\](.*?)\[/bb\](.*\[/mdr\])#', '$1<strong>$2</strong>$3', $texte);
// Je remplace les balises ii comprises entre des balises mdr et je supprime les balises mdr
$texte = preg_replace('#\[mdr\](.*)\[ii\](.*?)\[/ii\](.*)\[/mdr\]#', '$1<em>$2</em>$3', $texte);
echo $texte;
Mais, pour généraliser, il me semble pas inutile de se pencher sur la proposition de Benjamin.

Fred
merci pour ta reponse c'est ce que je voulais
sourcilpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 14h41   #12
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Professeur des Ecoles
Secteur : Enseignement

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Citation:
Il faut toujours généraliser au maximum pour faciliter la maintenance
Tout à fait d'accord, alors...
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
$bb_tags = array(
	'lol' => array (
		'bb' => 'strong',
		'ii' => 'em'
	),
	'mdr' => array (
		'bb' => 'em',
		'ii' => 'strong'
	)
);
 
$bb_patterns=array();
$bb_replace=array();
foreach ($bb_tags as $code => $balises) {
	foreach ($balises as $tag => $balise) {
		$bb_patterns[]="#(\[$code\].*)\[$tag\](.*?)\[/$tag\](.*\[/$code\])#";
		$bb_replace[]="$1<$balise>$2</$balise>$3";
	}
	$bb_patterns[]="#\[$code\](.*?)\[/$code\]#";
	$bb_replace[]="$1";
}
 
$texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
$texte = preg_replace($bb_patterns, $bb_replace, $texte);
echo $texte;
Fred
micetf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 15h32   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Note que ma solution n'utilise pas de structures de boucles
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h04   #14
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Professeur des Ecoles
Secteur : Enseignement

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Citation:
Envoyé par Benjamin Delespierre Voir le message
Note que ma solution n'utilise pas de structures de boucles
Effectivement...
mais elle ne répond pas à la question de sourcilpower.
En effet, tu ne gères pas la différence de traduction des balises selon que le code se trouve entre des balises [lol] ou [mdr]. Ce que je me suis attaché à faire.

Ce qui n'empêche pas qu'il existe certainement une solution élégante à base de array_map pour supprimer les structures de boucles...

Fred
micetf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h34   #15
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Effectivement, je me suis attaché à la transcription des balises, je ne prévois pas de comportement dissocié selon le contexte de la balise bb parente à une balise donnée.

Remarque, je me demande bien à quoi ça peut servir de faire de cette manière...
En BB code, l'élément suivant
helloworld
est traduit par
<strong><i>hello</i>world</strong>
Je vois mal comment on peut avoir besoin d'autre chose...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre 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 14h13.


 
 
 
 
Partenaires

Hébergement Web