0

我正在使用 XHTML 过渡文档类型在浏览器中显示内容。但是,显示的内容是通过 XML 解析器 (DOMDocument) 传递的,以便在输出到浏览器之前进行最后的润色。

我为我的网站使用定制设计的 CMS,它允许我对网站进行更改。我有一个模块,它允许我以类似于 WordPress 小部件的方式在我的网站上显示 HTML 脚本。

我现在面临的问题是我需要确保通过此模块提供的任何代码都应该采用有效的 XHTML 格式,否则模块将需要将代码转换为有效的 XHTML。目前,如果输入代码的一部分不符合 XHTML,那么我的 XML 解析器会中断并引发警告。

我正在寻找的是一种解决方案,它对 URL 中存在的实体和通过 TextArea 控件提供的输入的文本部分进行编码。例如,以下字符串将破坏解析器给出实体引用错误:

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

以下行也会导致相同的错误:

<a href="http://www.somesite.com">Books & Cool stuff<a/>

PS如果我使用htmlentitiesor htmlspecialchars,他们也会转换标签的尖括号,这不是必需的。我只需要对字符串的 url 和文本部分进行转义/编码。

任何帮助将不胜感激。

谢谢和问候, Waqar Mushtaq

4

3 回答 3

1

您需要做的是首先生成有效的 XHTML。您的所有属性都非常重要。

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

应该

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>

<a href="http://www.somesite.com">Books & Cool stuff</a>

应该

<a href="http://www.somesite.com">Books &amp; Cool stuff</a>

总是生成有效的 XHTML 并不容易。如果可能的话,我建议您找到其他方式进行后期处理。

于 2011-08-07T17:01:00.950 回答
0

HTML Tidy 是一个计算机程序和一个库,其目的是修复无效的 HTML 并改进生成的标记的布局和缩进样式。

http://tidy.sourceforge.net/

它能够修复的不良 HTML 示例:

  • 缺少或不匹配的结束标签,混淆标签
  • 添加缺少的项目(一些标签,引号,...)
  • 报告专有 HTML 扩展
  • 将标记的布局更改为预定义样式
  • 将字符从某些编码转换为 HTML 实体
于 2011-08-07T16:57:24.277 回答
0

正如在快速评论中已经建议的那样,您可以使用PHP tidy extension Docs非常舒适地解决问题。

要将 HTML 片段 - 甚至是好的标签汤 - 转换为DomDocumentSimpleXML可以处理的内容,您可以使用以下内容:

$config = array(
    'output-xhtml' => 1,
    'show-body-only' => 1
);
$fragment = tidy_repair_string($html, $config);
$xhtml = sprintf("<body>%s</body>", $fragment);

示例:使用tidy_repair_stringDocs将标签汤 html 格式化为有效的 xhtml 。

Tidy 有很多选项,这两个用于片段和 XHTML 兼容性。

现在剩下的唯一问题是这个 XHTML 片段可以包含DomDocumentSimpleXML不理解的实体,例如&nbsp;. 这和其他在 XML 中是未定义的。

DomDocument相关而言(你写你使用它),它支持加载 html而不是 xml 以及处理这些实体:

$dom = new DomDocument;
$dom->loadHTML($xhtml);

示例:使用 DomDocument 加载 HTML

于 2011-08-07T19:08:53.900 回答