确保PHP中的字符串中的有效XHTML

时间:2011-08-07 16:52:35

标签: php xml-parsing html-entities htmlspecialchars

我正在使用XHTML Transitional doctype在浏览器中显示内容。但是,显示的内容是通过XML Parser(DOMDocument)传递的,用于在输出到浏览器之前进行最后的触摸。

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

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

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

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

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

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

P.S。如果我使用htmlentitieshtmlspecialchars,他们还会转换标记的尖括号,这不是必需的。我只需要对字符串的URL和文本部分进行转义/编码。

非常感谢任何帮助。

谢谢和问候, Waqar Mushtaq

3 个答案:

答案 0 :(得分: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并不容易。如果可能的话,我建议你找一些其他方式进行后期处理。

答案 1 :(得分:0)

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

http://tidy.sourceforge.net/

它能够解决的错误HTML示例:

  • 缺少或不匹配的结束标记,混合标记
  • 添加缺失的项目(某些标签,引号,......)
  • 报告专有的HTML扩展
  • 将标记的布局更改为预定义样式
  • 将某些编码中的字符转换为HTML实体

答案 2 :(得分:0)

正如快速评论中已经建议的那样,您可以使用PHP tidy extensionDocs解决问题。

要将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 has many options,片段和XHTML兼容性需要使用这两个。

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

DomDocument而言(你写过你使用它),它支持loading html而不是xml,它也处理这些实体:

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

示例:使用DomDocument加载HTML