JeuWeb - Crée ton jeu par navigateur
[PHP] Equivalent de strip_tag() avec remplacement ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Equivalent de strip_tag() avec remplacement ? (/showthread.php?tid=6475)

Pages : 1 2


[PHP] Equivalent de strip_tag() avec remplacement ? - Argorate - 31-10-2012

Bonjour,

je voulais savoir si y avait moyen d'avoir une fonction qui supprimer tous le html d'un texte mais qui a chaque effacement remplace la sous chaine supprimé par une chaine X donner en paramètre

exemple:


$texte = "toto part en <strong>vacances</strong> et il adore faire du <em>ski</em> !";

echo suppr_html($texte, "_"); //retourne => "toto part en _vacances_ et il adore faire du _ski_ !"

y a t-il moyen d'avoir cette fonction (comme strip_tag() amélioré) ?

thx.


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - niahoo - 31-10-2012

au hasard et sans vérifier mon code :



function ($str,$rpl) {
return strip_tags(preg_replace('/<[^<>]>/', $rpl, $str));
};




RE: [PHP] Equivalent de strip_tag() avec remplacement ? - Criptus - 31-10-2012

Salut
Tu peux faire sa avec du bbcode vu que c'est toi qui détermine par quoi tu veux remplacer telle balise
Petit exemple


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - Argorate - 31-10-2012

le bbcode c'est dans l'autre sens: tu mets des [b] à a la base et au moment de lire tu remplaces par <b>.

'/<[^<>]>/' comment ça se lit? les crochets du milieu représente des caractère qui ne doivent pas être présent?
j'avais pensé a faire ça, mais le problème c'est que si un tag est mal fermé, cela va remplacer tout un bloc de texte au lieu d'une seul balise, ou encore si tu as des "inférieur" ou "supérieur" en temps que texte, il va tout te supprimer, c'est pour ça que c'est vachement complexe en fait^^


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - niahoo - 31-10-2012

Tu peux valider le HTML auparavant.

D'où provient ce HTML ?


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - Xenos - 31-10-2012

Les crochets délimitent une classe de caractères, et ^ signifie "tout sauf..."
donc '/<[^<>]>/' se lit "un < puis n'importe quoi sauf des < ou > puis un >" (enfin, il me semble).
Le problème, c'est qu'un tag mal formé pourrait planter ce preg, non (exemple: <tag attribute="bidule>">: le ">" de bidule va être marqué comme fin de balise, non?

Je pense que tu devrais plutôt procéder en deux temps:
dans un premier temps, la chaine "chaine1", celle d'origine, est strippé avec strip_tag pour donner "chaine2", sans balise, et sans les remplacement. Ensuite,k en comparant chaine1 et chaine2, tu peux repérer les endroits où du texte de chaine 1 a disparu, et donc, en déduire s'il y avait un tag à cet endroit (et le cas échéant, tu peux même récupérer le tag d'origine de chaine2). En revanche, le seul oint délicat, c'est que si deux tags se suivent dans la chaine1 (exemple: <b><u>machin</u></b> et du coup chaine2="machin"), il faudra voir si tu veux vraiment détecter les deux tags ou un seul...


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - niahoo - 01-11-2012

(31-10-2012, 09:33 PM)Xenos a écrit : Les crochets délimitent une classe de caractères, et ^ signifie "tout sauf..."
donc '/<[^<>]>/' se lit "un < puis n'importe quoi sauf des < ou > puis un >" (enfin, il me semble).

C'est bien ça. Cest une approche simpliste qui devrait marcher dans la plupart des cas. Ensuite il nous faut savoir d'ou proviennent tes chaines pour savoir si éventuellement des '<' et des '>' peuvent se glisser dans les attributs. D'ailleurs, en HTML, sont-ils autorisés dans des attributs ? A priori je dirais que non même si les navigateurs ne devraient pas broncher pour autant.

(31-10-2012, 09:33 PM)Xenos a écrit : Le problème, c'est qu'un tag mal formé pourrait planter ce preg, non (exemple: <tag attribute="bidule>">: le ">" de bidule va être marqué comme fin de balise, non?

idem.

(31-10-2012, 09:33 PM)Xenos a écrit : ...

Pour le reste, il y a toujours la possibilité de créer un parser qui "mange" la chaine caractère par caractère, avec un automate (finite state machine):

* S'il est dans le texte il accepte tout, sauf un '<' auquel cas il passe en état balise.
* En état balise, il "mange" d'abord le tag, puis il passe en état liste d'attributs.
* En état liste d'attributs il accepte un ou plusieurs espaces suivis de caractères, et attend =" pour passer en état contenu d'attribut, ou /> ou > pour revenir en état texte
* En état contenu d'attribut il attend un " (sauf si précédé par un \) auquel cas il revient en liste d'attributs

ça fait donc uniquement 4 fonctions a définir. Voilà après il faut traiter la chaine caractère par caractère (en testant les deux prochains caractères pour =" , \" et /> , c'est pas très performant, mais c'est pas grave si la fonctionalité n'est pas utilisée très intensivement.

ça peut être fun a implémenter, l'affaire de 50 minutes.

Tu peux vouloir gérer les valeurs d'attributs entourés de simples quotes au lieu de doubles, dans ce cas il faut te rappeler du caractère d'entrée pour surveiller celui de sortie

Mais bon, il doit bien y avoir un parser HTML en php qui fait déjà tout ça.

Hum bon oublie ce que j'ai dit c'est sur-chiant a implémenter. Je pensais que ce serait fun mais en fait bof.


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - niahoo - 01-11-2012

Bon ben j'ai mis beaucoup plus de temps (1h30 ~)mais au final c'était interessant. j'avais déjà joué avec des parsers et je comprends maintenant globalement comment ils fonctionnent.

Je pense qu'il y a moyen de factoriser grandement mon code

Mais ne t'avises pas de l'utiliser, il doit déjà utiliser des parsers qui font ça bien mieux



http://pastebin.com/pR67GmAg


note que les balises auto fermantes (ici un 'br' ) ne sont pas remplacées par un underscore. si on le souhaitait, il faut déplacer la ligne 162 hors du if/else

[pastebin]pR67GmAg[/pastebin]

dans la fonction attr_val, il y aces lignes, je ne sais pas pourquoi, elles ne servent à rien
Code :
if ($this->lookup('')) {

        }



RE: [PHP] Equivalent de strip_tag() avec remplacement ? - Xenos - 02-11-2012

(01-11-2012, 12:40 AM)niahoo a écrit : [...]savoir si éventuellement des '<' et des '>' peuvent se glisser dans les attributs. D'ailleurs, en HTML, sont-ils autorisés dans des attributs ? A priori je dirais que non même si les navigateurs ne devraient pas broncher pour autant.

idem.

Si l'utilisateur entre ces données HTML, alors, on ne peut pas se fier à "est-ce que HTML autorise ca ou pas", car rien ne dit que l'utilisateur a respecté HTML (d'où la demande sur "d'où vient ce code HTML?" je suppose.... BIen que normalement, il ne faut pas se baser sur "l'entrée HTML du programme provient de' tel endroit donc elle est conforme HTML" car cela peut ne pas être toujours vrai, si le développeur qui a généré l'HTML s'est planté par exemple).

Pourquoi te faut-il remplacer les tags par des underscores d'ailleurs ? Il est peut-etre possible de faire autrement et de ne pas faire un remplacement des tags mais "autre chose" (ne sachant pas le pourquoi, je ne sais pas si c'est possible).


RE: [PHP] Equivalent de strip_tag() avec remplacement ? - Argorate - 02-11-2012

Le but est de remplacer le html par le caractère passer en paramètre.

Ca peut être '' (vide) ce qui revient à faire strip_tag, ou un caractère ou suite de caractères...

Le problème est comme Xenos le souligne, on ne peut pas se fier a la valider html du texte source, du coup le remplacement de ce genre est trop risqué... perte de données possible!