Fermer les balises html en fin de requete

Signaler
Messages postés
55
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
22 août 2007
-
Messages postés
4
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
19 janvier 2010
-
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

Messages postés
55
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
22 août 2007

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.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
6
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);
Messages postés
7
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
6 juillet 2006

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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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).
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
6
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);
Messages postés
55
Date d'inscription
vendredi 12 mars 2004
Statut
Membre
Dernière intervention
22 août 2007

Cool merci.
Messages postés
746
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
23 mai 2007
6
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);
Messages postés
4
Date d'inscription
samedi 18 novembre 2000
Statut
Membre
Dernière intervention
19 janvier 2010

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 !