Fermer les balises html en fin de requete

cs_badben Messages postés 55 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 22 août 2007 - 6 juil. 2006 à 18:54
Dahevos Messages postés 4 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 19 janvier 2010 - 19 janv. 2010 à 20:25
Bonjour,

Je cherche une fonction qui permet de fermer les balises HTML d'une variable texte qui comprend de code HTML.
Au cas ou l'utilisateur ne ferme pas correctement les balises.

Par exemple, ici, là, dans ce forum je vais essayer de tapper un message comprenant des balises HTML :

bonjour je suis un message, et je suis gras.

Comme vous le voyez la balise est ouvete mais pas fermée. Par contre le texte suivant n'est pas en gras car : ou les balises HTML ne sont pas activées sur ce forum ou bien une parade a été installée.

8 réponses

cs_badben Messages postés 55 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 22 août 2007
6 juil. 2006 à 18:57
Voilà j'ai fait le test sur le forum, et les balises HTML ne sont pas autorisées, pas de pôt pour moi :) mon exemple foire.

Mais bon en gros je désire une fonction qui permette de résoudre ça :

bonjour je suis un message, et je suis gras.

-> bonjour je suis un message, et je suis gras.

Et donc ajouter une balise fermante en fin d'affichage.

Je peux toujours mettre echo '</script></li>...'; après l'affichage de ma variable mais bon.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 juil. 2006 à 21:48
Tu crée une pile FILO, tu pushe les balises à chaque fois que tu en trouve une, et tu pop tout àla fin, c'est le plus simple à faire je pense.

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
cs_friedman Messages postés 7 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 6 juillet 2006
6 juil. 2006 à 22:47
Sinon tu utilises le système D, tu enregistre ton texte dans une variable (sa ne changera pas de d'habitude)
tu verifie si la balise gras existe sinon tu la ferme en fin de texte.
J'espere pour toi qu'une fonction existe, car je me vois mal utilisez ma methode
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 juil. 2006 à 06:16
hello,

il n'existe pas de fonction toute prête pour ça.
La solution de NightLord est la meilleure, mais elle est plus complexe qu'il n'y parait...(il faut faire attention dans ce cas aux balises qui, elles, sont fermées...ne pas les mettre dans la pile, et ne pas créer de mauvaise imbrication).
0

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

Posez votre question
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 juil. 2006 à 11:22
En fait, à chaque balise trouvée, on la pushe dans la pile, sauf si c'est une balise vide (img / br / hr) : dans ce cas là on vérifie si elle est bien fermée. Quand on trouve une balise de fermeture, on regarde si il s'agit du même tag que dans la pile, si c'est le même on pop, si c'est un autre on lance une erreur. A la fin, si il reste des balises dans la pile, on pop.

Je pense que ça devrait marcher comme ça, je vais essayer et je posterais peut-être la source içi.

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
cs_badben Messages postés 55 Date d'inscription vendredi 12 mars 2004 Statut Membre Dernière intervention 22 août 2007
7 juil. 2006 à 11:40
Cool merci.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 juil. 2006 à 12:27
Bon après une heure de programmation, j'en arrive à ça :

<?php

//Une classe utilitaire pour faire une pile FILO en PHP
class FILO
{
  private $stack;

  public function FILO()
  {
    $this->stack = array();
  }

  public function push($elem)
  {
    array_unshift($this->stack, $elem);
  }

  public function getFirst()
  {
    return $this->stack[0];
  }

  public function pop()
  {
    $value = $this->stack[0];
    array_shift($this->stack);
    return $value;
  }

  public function isEmpty()
  {
    return empty($this->stack);
  }
}

function fermer($text)
{
  $temp = $text;
  $transformed = $temp;
  $stack = new FILO();

  //Tant qu'on trouve des tags, on boucle
  while(true)
  {
    if(strlen($temp) == 0) break;
    $pos1 = strpos($temp, '<');
    if($pos1 == -1)
    {
      break;
    }

    $pos2 = strpos($temp, '>');
    if($pos2 == -1)
    {
      throw new Exception('Un caractère &lt; a été trouvé sans caractère &gt; correspondant.');
      break;
    }

    //On récupère le tag
    $tag = substr($temp, $pos1 + 1, $pos2 - $pos1 - 1);
    //echo $tag.'
';

    if($tag[0] != '/')
    {
      //Si c'est une balise sans fermeture, on ne la pushe pas
      if($tag[strlen($tag) - 1] != '/')
        $stack->push($tag);
    }
    else
    {
      //On vérifie que c'est le bon tag de fermeture
      $tag = substr($tag, 1, strlen($tag) - 1);
      if($stack->getFirst() != $tag)
      {
        throw new Exception('Les balises d\'ouverture / fermeture ne correspondent pas');
      }

      //On pop
      $stack->pop();
    }

    //On tronque la chaine après le tag
    $temp = substr($temp, $pos2 + 1, strlen($temp) - 1 - $pos2);
    //echo $temp.'
';
  }

  //Tant que ce n'est pas vide, on pop
  while(!$stack->isEmpty()) $transformed .= '</'.$stack->pop().'>';

  return $transformed;
}

$text = fermer($_GET['texte']);
echo htmlentities($text);

?>

Dis moi si ça te convient !

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
Dahevos Messages postés 4 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 19 janvier 2010
19 janv. 2010 à 20:25
Désolé de upper le sujet, mais ce genre de fonction m'intéresse ENORMEMENT ( j'en ai clairement besoin pour un projet que je dois rendre très bientôt ) et donc j'aimerai savoir si une âme charitable pourrait corriger le script trouvé plus haut, car il ne fonctionne pas :(

Si j'ouvre une balise avec par exemple, et que je la ferme pas, voila ce qu'il me donne :

j'ai oublié de fermer </>></></?></m?></rm?> etc..... ca continue comme ca en boucle donc ca bug :(

je voulais savoir aussi si je fais un si ce ignorer celui-ci ( si par exemple on avait pas ouvert de avant !

Merci de me répondre !
0
Rejoignez-nous