[PHP] Remplacement + fonction

Résolu/Fermé
Signaler
-
Messages postés
2557
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
30 mai 2015
-
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 :)

21 réponses

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

a tu essayé htmlspecialchars ?
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
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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.
Messages postés
18614
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
28 novembre 2021
4 336
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 >.
Messages postés
18614
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
28 novembre 2021
4 336
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);
?>

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
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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

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) ^^
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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
Messages postés
18614
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
28 novembre 2021
4 336
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é) ;)

Heu... question peut-être con, mais que veux tu dire par "Inverse mon entities" ?
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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

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 ;)
Messages postés
2557
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
30 mai 2015
353
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...

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()
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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
Messages postés
2557
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
30 mai 2015
353
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
Messages postés
2557
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
30 mai 2015
353
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é ;-)
Messages postés
66
Date d'inscription
vendredi 25 juillet 2008
Statut
Membre
Dernière intervention
25 octobre 2010
5
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

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...
Messages postés
18614
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
28 novembre 2021
4 336
J'ajoute qu'avec "ma" méthode, tu peux facilement intégré un « Syntax Highlighter » comme GeSHi.
Messages postés
2557
Date d'inscription
samedi 21 juillet 2007
Statut
Membre
Dernière intervention
30 mai 2015
353
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..

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 ?
Messages postés
18614
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
28 novembre 2021
4 336
highlight_string suffira amplement.