preg_replace: remplacement de caractères excepté ceux situés dans une balise

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : preg_replace: remplacement de caractères excepté ceux situés dans une balise

par anarianthe » 08 mai 2009, 10:21

Que dire... c'est simple, clair, facile, super... =D>

Bref, c'est résolu!

Milles merci et merci beaucoup! =D>

par sadeq » 07 mai 2009, 14:26

Preg_replace_callback() est ton amie, elle permet de personnaliser une fonction de remplacement de contenu ciblé.

Voici un exemple:
<?php
$page='<div class="menu">introduction: les <u>intérêts généraux</u></div>'; 
$pattern = "'>([^<]*)'si"; // recherche les textes en dehors des balises
echo preg_replace_callback($pattern, "replace_all", $page); 
// fonction gérant le remplacement des occurrences trouvées par preg_replace_callback
// ici, cette fonction va remplacer tous les i par vide (supprimer les i) dans le texte trouvé
function replace_all($matches){ // $matches est un tableau qui contient à chaque fois un morceau de texte trouvé par la RegExp de recherche.
	return str_replace("i", "", $matches[0]); // suppression des i dans une partie trouvée (dépend des () dans le pattern, $matches[0] correspond au premier critère entre () dans le pattern)
}
?>
Et le tour est joué :wink:

Remarque que si tu veux faire aussi l'inverse : c'est à dire changer les i dans le texte contenu dans les balises alors le pattern de l'expression doit être comme ça :
$pattern = "'<[^<]*>'si";
Car ce pattern cherche toutes les balises.

preg_replace: remplacement de caractères excepté ceux situés

par anarianthe » 06 mai 2009, 11:25

Bonjour bonjour!

Voilà mon problème: je souhaite remplacer, dans une chaîne de caractère, certains caractères, à condition que ceux-ci ne fassent pas partie d'une sous-chaîne.

Plus précisément, la chaîne de caractère est du code HTML. Je souhaite supprimer des caractères à conditions que ceux-ci ne se situent pas dans une balise (altérer le texte sans altérer les balises).

Exemple: supprimer tous les "i" de la chaîne de caractère, sauf ceux qui sont dans une balise, les remplaçant par un espace

<div class="menu">introduction: les <u>intérêts généraux</u></div>

devrait devenir:
<div class="menu"> ntroduction: les <u> ntérêts généraux</u></div>



Je suis tombé sur la fonction preg_replace qui me semble appropriée, mais j'avoue sécher sur l'expression rationnelle correcte à utiliser.

avec <[^>]*?> j'arrive à isoler les balises. Il devient alors, par exemple, facile de supprimer les balises et de n'afficher que le texte:
$page='<div class="menu">introduction: les <u>intérêts généraux</u></div>';
$pattern = "'>[^<]*'si";
echo preg_replace($pattern, " ", $page);
-> Affiche introduction: les intérêts généraux


Mais j'aimerais isoler tous les "i" qui n'appartiennent pas aux balises... et afficher:
<div class="menu"> ntroduction: les <u> ntérêts généraux</u></div>


J'ai pas mal cherché (google) sans succès. Est-ce possible utilisant preg_replace (ce qui simplifierait beaucoup le problème, évitant des lignes de code pour arriver au même résultat)? Comment?

Si quelqu'un a une idée ou des pistes, je suis preneur! Merci beaucoup de m'avoir lu, et doublement merci si vous parvenez à m'aider à avancer! :D