36 votes

Comment fermer les balises HTML non fermées?

Chaque fois que nous récupérons du contenu saisi par l'utilisateur avec une modification de la base de données ou de sources similaires, nous pouvons récupérer la partie qui contient uniquement la balise d'ouverture mais pas de fermeture.

Cela peut entraver la mise en page actuelle du site Web.

Existe-t-il un moyen côté client ou côté serveur de résoudre ce problème?

27voto

KJS Points 245

Trouvé une excellente réponse pour celui-ci:

Utilisez PHP 5 et utilisez la méthode loadHTML () de l'objet DOMDocument. Cette analyse automatique HTML mal formé et un appel ultérieur à saveXML () affichera le HTML valide. Les fonctions DOM peuvent être trouvées ici:

http://www.php.net/dom

L'utilisation de ceci:

 $doc = new DOMDocument();
$doc->loadHTML("$yourText");
$yourText = $doc->saveHTML();
 

16voto

kamal Points 756

j'ai une solution pour php

 <?php
    // close opened html tags
    function closetags ( $html )
        {
        #put all opened tags into an array
        preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
        $openedtags = $result[1];
        #put all closed tags into an array
        preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
        $closedtags = $result[1];
        $len_opened = count ( $openedtags );
        # all tags are closed
        if( count ( $closedtags ) == $len_opened )
        {
        return $html;
        }
        $openedtags = array_reverse ( $openedtags );
        # close tags
        for( $i = 0; $i < $len_opened; $i++ )
        {
            if ( !in_array ( $openedtags[$i], $closedtags ) )
            {
            $html .= "</" . $openedtags[$i] . ">";
            }
            else
            {
            unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
            }
        }
        return $html;
    }
    // close opened html tags
 

?>

vous pouvez utiliser cette fonction comme

    <?php echo closetags("your content <p>test test"); ?>
 

15voto

Gordon Points 156415

Vous pouvez utiliser bien Rangé:

Tidy est une liaison pour le Tidy HTML nettoyer et réparer utilitaire qui vous permet non seulement de nettoyer et manipuler des documents HTML, mais aussi de parcourir l'arborescence du document.

ou HTMLPurifier

HTML Purificateur est conforme aux normes Filtre HTML bibliothèque écrite en PHP. HTML Purificateur permettra non seulement de supprimer tous les malveillants code (mieux connu sous le nom XSS) avec un fond vérifiés, sécuriser encore permissive blanche, il permettra également de s'assurer que vos documents sont conformes aux normes, quelque chose seulement possible avec un connaissance approfondie des spécifications du W3C.

6voto

Andrew Points 5374

En outre, côté serveur, des outils comme l'ordre, vous pouvez également utiliser le navigateur de l'utilisateur pour faire le nettoyage pour vous. L'un des très grandes choses au sujet de innerHTML c'est qu'il va appliquer le même à la volée de réparation de contenu dynamique comme il le fait pour les pages HTML. Ce code fonctionne très bien (avec deux mises en garde), et rien n'est écrit à la page:

var divTemp = document.createElement('div');
divTemp.innerHTML = '<p id="myPara">these <i>tags aren\'t <strong> closed';
console.log(divTemp.innerHTML); 

Les mises en garde:

  1. Les différents navigateurs seront de retour des différentes chaînes. Ce n'est pas si mauvais, sauf dans le cas de l'ei, qui sera de retour en majuscule balises et dépouiller les citations des attributs de la balise, ce qui ne sera pas validée. La solution ici est de faire une simple opération de nettoyage sur le côté serveur. Mais au moins, le document est bien structuré XML.

  2. Je soupçonne que vous pourriez avoir à mettre un délai avant la lecture de la innerHTML -- donner le navigateur l'occasion de digérer la chaîne -- ou vous risquez de retrouver exactement ce qui a été mis dans. J'ai juste essayé sur IE8 et il semble que la chaîne est analysée immédiatement, mais je ne suis pas sûr que sur IE6. Il serait probablement préférable de lire le innerHTML, après un retard (ou de le jeter dans un setTimeout() pour forcer à la fin de la file d'attente).

Je vous recommande de prendre @Gordon des conseils et de l'utiliser en ordre si vous avez accès à celle-ci (il faut moins de travail pour mettre en œuvre) et, à défaut, utiliser innerHTML et écrire votre propre bien rangé fonction en PHP.

Et même si ce n'est pas une partie de votre question, que ce soit pour un CMS, pensez également à utiliser le YUI 2 l'Éditeur de Texte enrichi pour des trucs comme ça. Il est assez facile à mettre en œuvre, plutôt facile à personnaliser, l'interface est très familier à la plupart des utilisateurs, et il crache parfaitement valable code. Il y a plusieurs autres hors-la-plateau riche éditeurs de texte, mais YUI a la meilleure licence et est le plus puissant que j'ai vu.

3voto

Marcus Points 1

Une meilleure fonction PHP pour supprimer les balises non ouvertes / non fermées de webmaster-glossar.de (moi)

 function closetag($html){
    $html_new = $html;
    preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result1);
    preg_match_all ( "#</([a-z]+)>#iU", $html, $result2);
    $results_start = $result1[1];
    $results_end = $result2[1];
    foreach($results_start AS $startag){
        if(!in_array($startag, $results_end)){
            $html_new = str_replace('<'.$startag.'>', '', $html_new);
        }
    }
    foreach($results_end AS $endtag){
        if(!in_array($endtag, $results_start)){
            $html_new = str_replace('</'.$endtag.'>', '', $html_new);
        }
    }
    return $html_new;
}
 

utilisez cette fonction comme:

 closetag('i <b>love</b> my <strike>cat'); 
#output: i <b>love</b> my cat

closetag('i <b>love</b> my cat</strike>'); 
#output: i <b>love</b> my cat
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X