提问人:Peter Krauss 提问时间:2/15/2015 更新时间:7/12/2015 访问量:321
工具(过滤器)将HTML5转换为多语言标记?
Tool (filter) to convert HTML5 into Polyglot Markup?
问:
上下文:我的 HTML5 文档不需要 Javascript、动画、表单......它们“只是内容”。因此,可以过滤这些表示形式,只需要“全HTML5表示”的一些子集/约束。表达这种情况(以及其他更广泛的情况)的一个好方法是说“我的文档可以用多语言标记约束来表达”。
问:有没有一种工具可以将“任何 HTML5”转换为 Polyglot XHTML5(或过滤丢失虚假信息)?
最好是基于 DOM(或 XSLT 或 XQuery)扩展的工具。
答:
我不知道这样的工具,但基于正则表达式,我认为应该可以使用您喜欢的编程语言编写自己的转换器。我给你一个使用 Java 正则表达式的例子,但它也应该可以转移到 PHP。您可以在 regexplanet.com 上对其进行测试
给定:任何自闭合的 html 标签,例如
<textarea class="placeholder"/>
Target: 标签应转换为
<textarea class="placeholder"></textarea>
这可以使用 Java 正则匹配表达式来实现,例如替换字符串,如 .表达式查找标记中的第一个单词,将其分配给模式组 1,将标记上的所有属性分配给模式组 2。这使您能够在开始标记中连接组 1 和 2,并再次在结束标记中重用组 1。<\s*([^\s>]+)([^>]*)/\s*>
<$1$2></$1>
textarea
希望这会有所帮助。
评论
xmllint
我不会有一个完整的解决方案。 在我看来,这种转变有两个甚至三个阶段:
第 1 阶段:格式化 HTML5
在第一阶段,有一种黑色的艺术,需要满足HTML 5缺乏结构良好的要求。
在你拥有 DOM 之前,在你有机会获得期望远程看起来像 xml 的东西运行的工具之前,你需要这个。
那么谁实现了这样的转换:(几乎?)每个浏览器。相当多的人有源代码。您也可以从正在运行的浏览器中获取此信息: 检查源代码,看看它用 Tag soup 作为输入做了什么,你就会得到结构良好的源代码。
另一个可以找到此类源代码的地方是在允许您在网页中编辑 xhtml 的编辑器(FCKeditor 等)
例如 被改成<p>para<ul><li>bullet</ul><p>para
<p>para</p><ul><li>bullet</li></ul><p>para</p>
第 2 阶段:过滤掉 Polyglot 中不允许的内容
一旦 html 标签结构良好,下一步就是您必须删除多语言标记中不允许的内容,因为 html 解析器和 XML 解析器之间的解释方式存在差异。
您可能有机会使用 XSLT 并构建过滤器,但您无法验证所有过滤器,因为没有 DTD 或任何等效的东西来验证多语言 (x)html。即使是现有的少数 xhtml5 验证器也被废弃了,所以这将使你的任务变得困难。
无论如何,尝试找到其中一个存在的验证器的源代码是查找接近此的源代码的最佳选择。
第 3 阶段:修复外部实体
说什么 ?好吧,您可以拥有漂亮的多语言 (x)html 并包含一个执行单个 document.write 的 javascript,但它仍然失败。因此,在它起作用之前,您还需要追捕所有这些。
评论
DOMDocument::loadHTML($HTML, LIBXML_NOCDATA | LIBXML_NOWARNING |...etc.. )
saveXML()
C14N()
评论