2011-02-14 90 views
1

我们正在创建一个脚本来将某些XHTML文件转换为Word文件,但是,Word文件和HTML文件处理格式更改的方式有很大不同。取消嵌套HTML标记

例如,我们可以按照如下有节:

<p>Title 

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

Additional Information</p> 

这改变文件之间,因为一些前一定标准写旧文件,每个文件是由不同的人写的,创造的不一致。许多文件嵌套很多,很多文件都不是。问题出现在检测文件嵌套时,因为尽管它可以在Web浏览器中完美呈现,但Word文档的等效HTML必须格式化为以下格式,以便轻松转换为Word使用的XML格式(使用先前的例如):

<p>Title</p> 

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

<p>Addition Information</p> 

为Word文档,使用OpenXML的标准,在很大程度上依赖于格式的片段明确开始,可以创建一个新的部分之前结束。不幸的是,这适用于任何地方,甚至粗体或斜体部分。

我已经通过寻找什么类型的列表是的,去除p标签,而L1标签转换为一的OLI标签的有序列表和ULI为创建一个小的正则表达式列表转换成合适的格式无格式的列表。这反过来又被转换成适用于Word文档的正确的XML格式。

我遇到的问题是,如果说ap标签是嵌套的,就像在上面的例子中一样,如果是这样,要在li标签之前注入一个新的闭合p标签,在列表之后创建新的打开p标记以创建我们正在寻找的未嵌套线性标记。

我的问题是,如果有人知道是否有办法做到这一点相对简单,如正则表达式或类似的东西,或者如果它通常会更容易回到所有的遗留文件并清理它们达到目前的标准,使它们兼容。 (这是不可取的,因为我们有很多这些文件,并且不想错过任何不一致的地方,在我们捕捉它们之前创建格式不正确的Word文档)。

一般情况下,我们不使用更多的标签则P,OL/UL /李,EM,强,表/日/ TR/TD,和。我还发现了一些不在任何HTML标签内的文本,而这些文本最好是用p标签包装。

注意:PDF是难以被接受的,因为我们正在寻找易用性和脚本大小限制通常禁止这一点。

+3

你发现的是,你不能用正则表达式解析HTML。你需要一个全面的HTML解析器。 – Pointy 2011-02-14 15:56:33

+0

@Pointy不要。甚至。走。那里。:) – 2011-02-14 15:58:03

回答

1

我发现做到这一点,最简单的方法是去除内容的结束标记,然后取出第一个标签,以及。用通用部分结束标签替换每个开始标签,后跟相应的开头部分标签。最后,分别将第一个开始标记和最后一个结束标记附加到内容的开始和结束处,现在它工作正常。谢谢大家的帮助。

2

我建议使用像htmLawed这样的HTML库去除你不想处理的标签。

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

从他们的功能列表一个片段:

* 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) ^~`