2010-11-18 8 views
3

données présentées au format HTML et soumises au serveur, qui effectue un certain prétraitement.Problème avec l'étiquette img non fermée

Il fonctionne avec l'attribut "src" de la balise "img". Après le prétraitement et l'enregistrement, toutes les étiquettes "img" prétraitées ne sont pas auto-fermées.

Par exemple, si la balise "img" a été suit:

<img src="image.png" /> 

après prétraiter avec Nokogiri ou hpricot, ce sera:

<img src="/preprocessed_path/image.png"> 

Le code est assez simple:

doc = Hpricot(self.content) 
doc.search("img").each do |tag| 
    preprocess tag 
end 
self.content = doc.to_html 

Pour Nokorigi, il a la même apparence.

Comment résoudre ce problème?


Update 1

oublié de mentionner - j'ai la page HTML 5, que je suis en train de valider avec W3C Validator.

Lorsque tag "img" est dans une div, il plaintes au sujet suivant:

required character (found d) (expected i) 
</div> 

Par exemple, essayez de valider le code suivant:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="UTF-8" /> 
</head> 
<body> 
    <div> 
     <img src="image.png"> 
    </div> 
</body> 
</html> 

Vous obtiendrez la même erreur:

Line 9, Column 4: required character (found d) (expected i) 
</div> 

Répondre

3

Je pense que le problème est avec votre <html> où il supprime l'attribut xmlns en tant que XHTML. Cela semble être contradictoire avec le fait que ce n'est pas un document XHTML. Si vous supprimez cet attribut xmlns, il devrait être valide.

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8" /> 
    <title>something here</title> 
</head> 
<body> 
    <div> 
    <img src="image.png"> 
    </div> 
</body> 
</html> 
+0

Oh, merci! Je suis complètement oublié de cet espace de noms. Il a été laissé après copier-coller, cela a été fait il y a plusieurs mois. – AntonAL

0

Dans la fonction de prétraitement à laquelle vous déléguez, n'avez-vous pas le contrôle sur chaque balise img? Pouvez-vous ne pas retourner ce qui est déjà retourné et ajouter une étiquette de fermeture explicite?

+0

Bien sûr, je peux parse tout par les mains, en utilisant des expressions régulières sophistiquées, etc. Mais, cette tâche doit être à la bibliothèque, j'utilise – AntonAL

2

Le problème est que vos bibliothèques génèrent du HTML correct, et que le "/" final n'est pas correct en HTML. Sauf si vous utilisez l'application/xhtml + xml, cela ne sert à rien de l'avoir - la balise IMG se referme automatiquement dans toutes les versions de HTML, et le "/" n'a pas de sens. Si vous sont servant application/xhtml + xml, je pense que vous devrez utiliser explicitement to_xhtml de Nokogiri.

+0

voir Mise à jour 1 dans ma question – AntonAL

+0

@AntonAL: Vous PURGENT XHTML au lieu de HTML. Comme je l'ai dit, dans ce cas, vous aurez besoin de générer du XHTML au lieu du HTML. Ou utilisez le HTML. Vous avez juste besoin de choisir un et respectez-le. – Chuck

Questions connexes