[PHP] Remplacement + fonction

Résolu/Fermé
Utilisateur anonyme - 30 sept. 2009 à 21:06
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 - 2 oct. 2009 à 20:16
Bonjour,
je cherche depuis quelques temps à exécuter une fonction lors d'un remplacement par preg_replace(), je souhaiterais pouvoir exécuter un htmlentities() sur le texte :

prenons pour exemple ceci :
Blablabla ... exemple :
<?php
$var = 'inutile';
Texte totalement <?php echo $var; ?>.
?>
blablabla...

J'ai un texte dans lequel il y a du code php, et je ne veux pas que ce code soit interprété, et je veux donc le convertir en entité html, seulement, ce bout de texte sera rentré avec d'autre texte, qui lui sera interprété :

Texte interprété, <a href="lien">Lien<a>, affichera une lien, <b>ceci sera en gras</b>

<balise><!--signale qu'il faut convertir le texte en entité html-->

Blablabla ... exemple :
<?php
$var = 'inutile';
Texte totalement <?php echo $var; ?>.
?>
blablabla...

</balise><!--le texte va être de nouveau interprété après cette balise-->


J'ai donc quelque chose comme ça :
$text = preg_replace('#<balise>(.+)</balise>#isU', '<div class="code">$1</div>', $text);

et je voudrais ajouté faire un htmlentities sur le "$1" pour le convertir en entité html, comme ça ce qui sera contenu dans les balises sera converti, pas le reste. Seulement, ça n'a pas l'air de vouloir marché, faire '<div class="code">.'htmlentities($1).'</div>' ne fonctionne pas...

Merci d'avance pour votre aide :)
A voir également:

21 réponses

lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
30 sept. 2009 à 21:56
mmhhh !! j'ai pas tout compris sur ce que tu voulais faire et sont interêt ??

a tu essayé htmlspecialchars ?
0
si je comprend bien votre question essais de le convertis en entitie html tout d'abord et puis replacer avec la fonction preg_replace('#<balise ..... etc
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 13:27
Salut,

Tu peux faire ceci :

$text = preg_replace('#<balise>(.+)</balise>#isU', '$1', $text);
$text = htmlentities($text);
$text = '<div class="code">'.$text.'</div>';

@+ !
Signature non conforme ==> Supprimée
Modération CCM.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
30 sept. 2009 à 22:23
Regarde du côté de preg_match_all et foreach.
Voici un script que je viens de pondre :
<?php
preg_match_all('#<code>(.+)
#i',$texte,$codes);
foreach($codes[1] as $code) {
$pattern = '#
'.$code.'
#i';
$replacement = '<div class="code">'.htmlspecialchars($code).'</div>';
$texte = preg_replace($pattern,$replacement,$texte);
}
echo nl2br($texte);
?></code>Remplace $texte par la variable qui contient ton texte.
La fonction htmlspecialchars s'appliquera à tous les textes entre <code > et </code >.
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
1 oct. 2009 à 19:55
Il y a eu un problème avec la balise code sur CCM.
Voilà le script (il suffit de retirer les espaces dans les balises) :
<?php
preg_match_all('#< code>(.+)</ code>#i',$texte,$codes);
foreach($codes[1] as $code) {
	$pattern = '#< code>'.$code.'</ code>#i';
	$replacement  = '<div class="code">'.htmlspecialchars($code).'</div>';
	$texte = preg_replace($pattern,$replacement,$texte);
}
echo nl2br($texte);
?>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
1 oct. 2009 à 19:48
Merci de vos réponses ;)

Je teste ça de suite avion-f16.
@Squad-G > si je fais ça, je n'aurais plus le texte se trouvant en dehors des balises "<balise>", donc je ne peux pas faire comme ça
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 12:06
Vrai, dans ce cas çi :

$text = htmlentities(preg_replace('#<balise>(.+)</balise>#isU', '$1', $text));
$text = '<div class="code">'.$text.'</div>';
Signature non conforme ==> Supprimée
Modération CCM
0
Utilisateur anonyme
1 oct. 2009 à 20:11
J'aime bien l'idée du htmlentities() autour du preg_replace, mais ça ne fonctionne toujours pas, le texte placé autour de <balise></balise> est aussi remplacé, sinon j'ai testé la méthode de avion-f16, et je penses que je vais réussir à faire quelque chose avec ça, mais si quelqu'un a une idée pour faire ça sans boucle c'est vrai que ce serait plus simple (et plus rapide) ^^
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 12:06
Inverse mon entities, et au lieu de <balise> tu aura

<balise>



^^

EDIT: grrrrr........ met les entités HTML déjà encodé & l t; et & g t ; sans les espaces ...
Signature non conforme ==> Supprimée
Modération CCM
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
1 oct. 2009 à 20:21
EDIT: grrrrr........ met les entités HTML déjà encodé & l t; et & g t ; sans les espaces ...
Si c'est à moi que tu t'adresses, je connais assez bien CCM pour savoir que ça ne fonctionne pas (déjà essayé) ;)
0
Utilisateur anonyme
1 oct. 2009 à 20:47
Heu... question peut-être con, mais que veux tu dire par "Inverse mon entities" ?
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 12:07
Bon, comme les cractères sont encodés ici, je t'ai fait s en photo : http://gi-001.guestimage.com/132f3e07475cde53d1923464f7ba9179.png
Signature non conforme ==> Supprimée
Modération CCM
0
Utilisateur anonyme
1 oct. 2009 à 21:13
Je ne vois pas trop ou tu veu en venir Squad-G, à partir du moment ou il y a un htmlentities sur la balise $text, tout le texte sera transformé en entitées html, pas seulement ce qui est contenu entre <balise> et </balise>
Merci quand même pour ton aide ;)
0
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
1 oct. 2009 à 21:16
je doit etre fatigué car j'ai toujour pas compris l'interet de ton truc ???

deja dans ton code tu defini $balise_name='balise' alors que tu recherche <balise>..???

si je te suis d'apres ton 1er post
Blablabla ... exemple :
<?php
$var = 'inutile';
Texte totalement <?php echo $var; ?>.
?>
blablabla...


tu veut faire un htmlentities sur $var ....?
ben tout simplement comme ça
Blablabla ... exemple :
<?php
$var = 'inutile';
Texte totalement <?php echo htmlentities($var); ?>.
?>
blablabla...
0
Utilisateur anonyme
1 oct. 2009 à 21:18
je ne veux pas faire un htmlentities sur $var, mais sur le texte contenu entre <balise> et </balise>, mais sans toucher au texte directement, donc en utilisant une fonction tel que preg_replace()
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 12:07
Tous cas, voici ce que j'utilise pour le BB Code et s amarche à merveille :

function Create_My_BBCode( $String ) 
{ 
 GLOBAL $Smilies_List; 
  
 /* 
  Text 
 */ 
 // [b]Bold[/b] 
 $String = preg_replace( '/\[b\]((\s|.)+?)\[\/b\]/', '<strong>\\1</strong>', $String ); 
 // [i]Italic[/i] 
 $String = preg_replace( '/\[i\]((\s|.)+?)\[\/i\]/', '<i>\\1</i>', $String ); 
 // [u]Underline[/u] 
 $String = preg_replace( '/\[u\]((\s|.)+?)\[\/u\]/', '<u>\\1</u>', $String ); 
 // [size=4]Text[/size] 
 $String = preg_replace( '/\[size=([1-7])\]((\s|.)+?)\[\/size\]/i', '<span style="font-size:\\1;">\\2</span>', $String ); 
 // [font=Arial]Text[/font] 
 $String = preg_replace( '/\[font=([a-zA-Z ,]+)\]((\s|.)+?)\[\/font\]/i', '<span style="font-family:\\1;">\\2</span>', $String ); 
 // [color=blue]Text[/color] 
 $String = preg_replace( '/\[color=([a-zA-Z]+)\]((\s|.)+?)\[\/color\]/i', '<span style="color:\\1;">\\2</span>', $String ); 
 // [color=#ffcc99]Text[/color] 
 $String = preg_replace( '/\[color=(#[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9])\]((\s|.)+?)\[\/color\]/i', '<span style="color:\\1;">\\2</span>', $String ); 
  
 /* 
  URL 
 */ 
 // [url=http://www.example.com]Text[/url] 
 $String = preg_replace( '/\[url=([^()<>\s]+?)\]((\s|.)+?)\[\/url\]/i', '<a href="\\1">\\2</a>', $String ); 
 // [url]http://www.example.com[/url] 
 $String = preg_replace( '/\[url\]([^()<>\s]+?)\[\/url\]/i', '<a href="\\1">\\1</a>', $String ); 
  
 /* 
  Pictures 
 */ 
 // [img]http://www/image.gif[/img] 
 $String = preg_replace( '/\[img\](http:\/\/[^\s\'"<>]+(\.(jpg|gif|png)))\[\/img\]/i', '<img alt="" title="" src="\\1" />', $String ); 
 // [img=http://www/image.gif] 
 $String = preg_replace( '/\[img=(http:\/\/[^\s\'"<>]+(\.(gif|jpg|png)))\]/i', '<img alt="" title="" src="\\1" />', $String ); 

 reset( $Smilies_List ); 
 while (list( $BBCode, $URL ) = each( $Smilies_List )) 
 { 
  $String = str_replace( 'B_'.$BBCode , '<img alt="" title="" src="Images/Smilies/'.$URL.'.png" />'  , $String ); 
  $String = str_replace( $BBCode  , '<img alt="" title="" src="Images/Smilies/'.$URL.'-Small.png" />' , $String ); 
 } 
  
 return $String; 
} 

Signature non conforme ==> Supprimée
Modération CCM
0
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
1 oct. 2009 à 21:25
ben pourqoui tu met <balise>..?
met plutot | pour signaler ta conversion et ensuite strpos et strrpos, tu recupere les indice de debut et de fin et tu remplace, c'est plus simple et plus rapide de chercher 1 caractere plutot qu'une chaine.

Tu aura le rang de ta premiere occurence de | (strpos) et celui de ta dernière (strrpos)
tu remplace entre le rang x et le rang y
0
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
1 oct. 2009 à 21:41
tiens un code tapé en 2/2

<?php
$texte='Texte interprété, <a href="lien">Lien<a>, affichera une lien, <b>ceci sera en gras</b>

|signale qu\'il faut convertir le texte en entité html|

Blablabla ... exemple :';

$debut=strpos($texte,'|');
$fin=strrpos($texte,'|');
echo ' la chaine a convertir commence au rang<b>'.$debut.'</b> et se termine au rang<b> '.$fin.'</b><br/>';

$remplace=substr($texte,$debut,$fin);
$remplace=htmlentities($remplace);
 $new_texte_deb=substr($texte,$debut-1);
 $new_texte_fin=substr($texte,$fin+1);
 
 $chaine_final=str_replace('|',' ',new_texte_deb.$remplace.$new_texte_fin); //on vire le separateur
 echo $chaine_final;

?>


tu t'embete plus avec des prg_replace..
pourquoi faire simple quand on peut faire compliqué ;-)
0
Squad-G Messages postés 66 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 25 octobre 2010 5
Modifié par baladur13 le 23/10/2010 à 12:05
La raison pour le quel un regex est meilleur est qu'il utilise moins de ressource au niveau de PHP, car il est rationnel.
Signature non conforme ==> Supprimée
Modération CCM
0
Utilisateur anonyme
2 oct. 2009 à 17:25
Merci à tous pour vos réponses, je pense que je vais reprendre soit la méthode de lewis34 soit celle de avion-f16 :)

@lewis34 > pourquoi je met "<balise>" ? mettre un "|" serait certe plus rapide, mais si j'ai un "if( ($machin==machin)||($truc==truc) )" dans le code à convertir, ça ne fonctionnera pas super...
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
2 oct. 2009 à 17:27
J'ajoute qu'avec "ma" méthode, tu peux facilement intégré un « Syntax Highlighter » comme GeSHi.
0
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
2 oct. 2009 à 20:16
je t'ai mis | comme ça tu peut mettre # aussi...
et puis tes conditions faut les faire avant d'inserer tes variables en utilisant par exemple la concaténation, tu t'embeteras moins, faut pas les mettre au milieu de tes valeurs à insérer..
0
Utilisateur anonyme
2 oct. 2009 à 17:38
D'ailleurs, par rapport à la coloration syntaxique, si le code à colorer contient seulement du php, vaut-il mieux utiliser la fonction highlight_string() ou un outil tel que GeSHi ?
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
2 oct. 2009 à 17:46
highlight_string suffira amplement.
0