取消嵌套HTML标签

时间:2011-02-14 15:55:07

标签: php html xhtml tags

我们正在创建一个脚本来将某些XHTML文件转换为Word文件,但是,Word文件和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标签,将li标签转换为有序列表的oli标签和未格式化的uli,将Lists转换为正确的格式名单。然后将其转换为Word文档的正确XML格式。

我遇到的问题是,检测起来要困难得多,如果说ap标签是嵌套的,就像上面的例子一样,如果是的话,在li标签之前注入一个新的关闭p标签,以及一个新的在列表后面打开p标签,以创建我们正在寻找的非嵌套线性标记。

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

通常,我们不使用更多标签,然后使用p,ol / ul / li,em,strong,table / th / tr / td和a。我还发现了一些不在任何HTML标签内的文本,最好包装在p标签中。

注意:PDF不是一个可接受的选项,因为我们正在寻找易用性,并且脚本大小限制通常禁止这样做。

2 个答案:

答案 0 :(得分: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) ^~`

答案 1 :(得分:1)

我发现最简单的方法是删除内容中的结尾标记,然后删除第一个标记。将每个开始标记替换为通用部分结束标记,然后是相应的开始部分标记。最后将第一个开始标记和最后一个结束标记分别附加到内容的开头和结尾,现在工作正常。谢谢大家的帮助。