Php 取消嵌套HTML标记

Php 取消嵌套HTML标记,php,html,xhtml,tags,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 Inform

我们正在创建一个脚本来将某些XHTML文件转换为Word文件,但是,Word文件和HTML文件处理格式更改的方式完全不同

例如,我们可能有如下一节:

<p>Title

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

Additional Information</p>
标题
  • 清单1

  • 清单2

  • 补充资料

    这会在文件之间发生变化,因为有些文件是在某些标准之前编写的遗留文件,而每个文件都是由不同的人编写的,从而造成不一致。许多文件嵌套得很重,而许多文件不是。在检测文件何时嵌套时会出现问题,因为虽然它可能在web浏览器中完美呈现,但Word文档等效HTML的格式必须与以下类似,以便轻松转换为Word使用的XML格式(使用上一个示例):

    标题

  • 清单1
  • 清单2
  • 附加信息

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

    我已经创建了一个小型正则表达式,通过查找列表的类型、删除p标记,并将li标记转换为有序列表的oli标记和未格式化列表的uli标记,将列表转换为正确的格式。然后将其转换为Word文档的正确XML格式

    我遇到的问题是,如果像上面的例子那样,p标记是嵌套的,那么很难检测到,如果是这样,在li标记之前插入一个新的结束p标记,在列表之后插入一个新的开始p标记,以创建我们正在寻找的非嵌套线性标记

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

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


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

    我建议使用HTML库(如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) ^~`
    
    *理解间隔不正确的标记内容(例如,分布在多行上)并正确间隔它们`
    *尝试平衡标签的良好格式^~`
    *理解何时缺少可省略的结束标记,如

    (在HTML 4中允许,例如过渡性标记)^~` *尝试只允许有效嵌套的标记^~` *删除或中和不良内容的选项^~` *试图纠正纯文本错误的常见错误(例如,直接在blockquote内)^~`
    我发现最简单的方法是删除内容中的结束标记,然后删除第一个标记。将每个开始标记替换为通用节结束标记,后跟相应的开始节标记。最后,将第一个开始标记和最后一个结束标记分别附加到内容的开头和结尾,现在可以正常工作了。谢谢大家的帮助。

    您发现无法用正则表达式解析HTML。您需要一个完整的HTML解析器。@Pointy不需要。即使去吧。有。:)@很遗憾,是的,但我希望,由于大多数都是相对统一的,我们可以顺利完成这一过程,而不必走那么远如果你有简单的元素(没有样式/属性等),你也许可以用一些正则表达式规范化这些元素。@ZZZBOV是的,它们都是简单的元素,没有任何属性或任何东西,所有这些都在CSS的其他地方处理。虽然不是我想要的,这对于我们面临的其他一些问题来说是有希望的。非常感谢。
      *  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) ^~`