[PHP] Remplacement + fonction
Résolu
Utilisateur anonyme
-
lewis34 Messages postés 2557 Date d'inscription Statut Membre Dernière intervention -
lewis34 Messages postés 2557 Date d'inscription Statut Membre Dernière intervention -
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 :
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é :
J'ai donc quelque chose comme ça :
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 :)
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:
- [PHP] Remplacement + fonction
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Fonction si et - Guide
- Easy php - Télécharger - Divers Web & Internet
- Fonction remplacer sur word - Guide
21 réponses
mmhhh !! j'ai pas tout compris sur ce que tu voulais faire et sont interêt ??
a tu essayé htmlspecialchars ?
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
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.
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.
Regarde du côté de preg_match_all et foreach.
Voici un script que je viens de pondre :
foreach($codes[1] as $code) {
$pattern = '#
$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 >.
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 >.
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) :
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); ?>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
$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) ^^
Inverse mon entities, et au lieu de <balise> tu aura
^^
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
<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
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
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 ;)
Merci quand même pour ton aide ;)
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 :
tu veut faire un htmlentities sur $var ....?
ben tout simplement comme ça
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()
Tous cas, voici ce que j'utilise pour le BB Code et s amarche à merveille :
Signature non conforme ==> Supprimée
Modération CCM
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
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
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
tiens un code tapé en 2/2
tu t'embete plus avec des prg_replace..
pourquoi faire simple quand on peut faire compliqué ;-)
<?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é ;-)
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
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...
@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...