2009-06-11 7 views
0

Est-ce que quelqu'un a un bon moyen de trouver si une chaîne contient du XHTML malformé en utilisant Javascript?Trouver XHTML malformé avec Javascript

Depuis ma page permet de l'utilisateur 'a généré des rendements XHTML (les utilisateurs peuvent faire confiance) et l'injecte dans les DOM, je veux un moyen de vérifier s'il y a des balises non fermées ou trop fermées, et les encoder en < et > afin qu'il affiche simplement les erreurs en tant que texte. De cette façon, tous les xhtml valides seront toujours affichés, et les invalides deviendront simplement des nœuds de texte, permettant au script de continuer au moins avec les erreurs.


Voici une méthode similaire que j'ai faite, qui est plutôt brute. Il a un but différent (stripping simplement toutes les balises xhtml valides et en laissant le reste. Il fonctionne en sélectionnant récursive le plus de balises internes et les dépouillant dehors.

stripHTML: function(html) { 
    var validXHTML = /<(\S+).*>(.*?)<\/\1>/i; 
    var validSelfClose = /<(input|img|br|hr)[^>]*\/>/gi; 

    html = html.replace(validSelfClose, ''); 

    if(validXHTML.test(html)) { 
    var loc = html.search(validXHTML); 
    var str = html.match(validXHTML); 
    html = html.substr(0, loc) + 
      strings.addPunctuation(html.substr(loc, str[0].length).replace(validXHTML, '$2')) + 
      html.substr((loc+str[0].length), html.length); 

    if(validXHTML.test(html)) { 
     html = strings.stripHTML(html); 
    } else { 
     return html; 
    } 
    } 
    return html; 
} 

Ne hésitez pas à améliorer ce qui précède, ou une réponse la question réelle.


Mise à jour

Mon idée pour un moyen simple d'au moins accueillir la plupart des cas est la suivante:

encode tous> et < pas que rien fermer ou ouvrir,

changer tous les noms de tag-intérieur <> en minuscules

travail récursive , commencer par les plus intimes balises, les passer des minuscules en majuscules <li>something</li> devient <LI>something</LI>

après la fin de récursion, la bande à tous les autres> et <

Remettre toutes les majuscules en minuscules

Y a-t-il des problèmes immédiatement prévus, à part le fait que cela prendra un certain temps?

+0

également essayer de poster le code dans refactormycode.com –

+0

Un problème un tel programme aura est de décider quelles sont les balises les plus erronées ... Considérez le fragment hi; quels tags voudriez-vous encoder? – Stobor

+0

@ Strobor, je suis paresseux, mais je voudrais essayer ce code particulier dans un grand nombre de navigateurs différents et voir ce qu'ils font. Je soupçonne que la plupart d'entre eux le comprendre en interne comme salut

Répondre

0

Je le fais sur le serveur avec HTMLTidy

htmltidy -asxhtml 
+0

Cela semble être un bon projet, mais je ne peux pas l'utiliser dans le cadre d'une page xhtml. –

+0

mais puisque vous avez déjà dit que vous utilisez XHR dans un autre commentaire ne pouvez-vous pas simplement poster le malformé (x) html à votre propre tidy.cgi? htmltidy peut réparer presque tout et ce qu'il ne peut pas réparer votre script ne serait probablement pas mieux. Bien sûr, cela ajoute peut-être 2 secondes à l'action de soumission/sauvegarde, mais est-ce vraiment un problème? – SpliFF

+0

btw, il y a un projet appelé jTidy qui peut probablement fonctionner "sur site" en tant qu'applet Java mais je ne pense pas que le projet soit activement maintenu et je ne l'ai pas utilisé. – SpliFF

0

Ainsi est la génération HTML aussi qui se passe sur le côté client? Le mieux est de valider le balisage généré à la source elle-même. Sinon, il existe peut-être un moyen de programmer le validateur W3C.

http://validator.w3.org/#validate_by_input

aussi voir, http://www.w3.org/QA/Tools/

+0

XHMTL Le code HTML est généré après la charge, en le saisissant d'un script fichier en utilisant xmlhttp Je dois pouvoir le valider sur le site, l'envoyer à w3c et attendre une réponse ne sera pas due pour ne pas mentionner que j'ai juste besoin o valider les tags, pas le document, car w3c retournera toujours une entrée de tags comme non valide. –