2011-02-14 8 views
1

Nous sommes en train de créer un script pour convertir certains fichiers XHTML en fichiers Word. Cependant, la façon dont les fichiers Word et les fichiers HTML gèrent les changements de formatage sont très différentes.Balises HTML Un-nest

Par exemple, nous pouvons avoir une section comme suit:

<p>Title 

    <ol> 
     <li><p>List 1</p></li> 
     <li><p>List 2</p></li> 
    </ol> 

Additional Information</p> 

Cela change entre les fichiers, car certains sont des fichiers existants par écrit avant certaines normes, et chaque fichier a été écrit par des personnes différentes, ce qui crée des incohérences. De nombreux fichiers sont fortement imbriqués, et beaucoup ne le sont pas. Le problème survient lors de la détection d'un fichier imbriqué, car, bien qu'il puisse parfaitement s'afficher dans un navigateur Web, un document HTML équivalent au format Word doit être formaté de la manière suivante pour être facilement converti au format XML utilisé par Word (en utilisant le précédent exemple):

<p>Title</p> 

<li>List 1</li> 
<li>List 2</li> 

<p>Addition Information</p> 

en tant que document Word, en utilisant les normes OpenXML, repose en grande partie sur des sections de format commençant explicitement et se terminant avant une nouvelle section peut être créée. Malheureusement, cela s'applique partout, même en gras ou en italique. J'ai déjà créé une petite expression régulière pour convertir les listes dans le bon format en trouvant le type de liste, en supprimant les balises p et en convertissant la balise li en une balise oli pour les listes ordonnées et uli pour listes non formatées. Celui-ci est ensuite converti en formatage XML approprié pour le document Word. Le problème que je rencontre est qu'il est beaucoup plus difficile à détecter, si disons que la balise AP est imbriquée, comme dans l'exemple ci-dessus, et si oui, d'injecter une nouvelle balise p avant la balise li, et un nouvelle balise p d'ouverture après la liste pour créer le marquage linéaire non imbriqué que nous recherchons. Ma question est de savoir si quelqu'un sait s'il y a un moyen de le faire relativement simplement, comme une expression régulière ou quelque chose comme ça, ou s'il serait généralement plus facile de revenir à tous les fichiers hérités et de les nettoyer jusqu'aux normes actuelles pour les rendre compatibles. (Ce n'est pas préférable, car nous avons beaucoup de ces fichiers, et ne voudrait pas avoir des incohérences manqué, créant des documents Word mal formatés avant que nous puissions les attraper).

Généralement, nous n'utilisons pas plus de balises que p, ol/ul/li, em, forte, table/th/tr/td, et a. J'ai également trouvé du texte qui ne se trouve pas dans les balises HTML, ce qui serait préférable d'envelopper dans un tag p. Remarque: Le format PDF n'est pas une option acceptable, car nous recherchons la facilité d'utilisation, et les limites de taille de script l'interdisent généralement.

+3

Ce que vous avez découvert est que vous ne pouvez pas analyser HTML avec une expression régulière. Vous avez besoin d'un analyseur HTML complet. – Pointy

+0

@Pointy Ne le faites pas. Même. Aller. Là.:) –

+0

@Pointy Malheureusement oui, mais j'espère que comme la plupart d'entre eux sont relativement uniformes, nous pouvons passer à travers le processus sans avoir à aller aussi loin. :) – shmeeps

Répondre

1

J'ai trouvé la meilleure façon de le faire est d'enlever les étiquettes se terminant dans le contenu, puis retirez la première balise ainsi . Remplacer chaque balise de début par une balise de fin de section générique suivie de son balise de section d'ouverture respective. Enfin, ajoutez la première balise d'ouverture et la dernière balise de fermeture sur le début et la fin du contenu, et cela fonctionne bien maintenant. Merci à tous pour votre aide.

2

Je suggère d'utiliser une bibliothèque HTML comme htmLawed pour supprimer les balises que vous ne voulez pas traiter.

http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/

Un extrait de leur liste de fonctionnalités:

* understands improperly spaced tag content (like, spread over more than a line) and properly spaces them ` 
    * attempts to balance tags for well-formedness ^~` 
    * understands when omitable closing tags like </p> (allowed in HTML 4, transitional, e.g.) are missing ^~` 
    * attempts to permit only validly nested tags ^~` 
    * option to remove or neutralize bad content ^~` 
    * attempts to rectify common errors of plain-text misplacement (e.g., directly inside blockquote) ^~` 
+0

Bien que ce ne soit pas exactement ce que je cherchais, cela semble prometteur pour quelques autres problèmes que nous avons. Je vous remercie. – shmeeps