如何在PHP中输出XML安全字符串?

时间:2010-06-24 02:08:18

标签: php xml

我正在做一些需要使用PHP脚本输出xml(utf-8)的东西。它有严格的格式要求,这意味着xml必须格式良好。我知道'htmlspecialchars'逃脱,但我不知道如何确保。是否有一些函数/库可以确保一切都很好?

2 个答案:

答案 0 :(得分:3)

您可以使用PHP DOMSimpleXML。这些也将为你逃避。

答案 1 :(得分:0)

马修答案表明"框架"用于生成XML代码。

如果您只需要简单的函数来处理XML类或执行" XML-translations",这是一个教学示例(用xmlsafe函数替换htmlspecialchars函数)。

PS:请记住,安全的UTF-8 XML不需要完整的实体编码,只需要htmlspecialchars ...不要求将所有特殊字符都转换为实体。

只需要在一串XML内容中转义3到4个字符:><&和可选"。另请参阅XML规范,http://www.w3.org/TR/REC-xml/&#34; 2.4字符数据和标记&#34;和&#34; 4.6预定义实体&#34;。

以下PHP函数将使XML完全安全:

// it is for illustration, use htmlspecialchars($s,flag).
function xmlsafe($s,$intoQuotes=0) {
if ($intoQuotes)
    return str_replace(array('&','>','<','"'), array('&amp;','&gt;','&lt;','&quot;'), $s);
    // SAME AS htmlspecialchars($s)
else
    return str_replace(array('&','>','<'), array('&amp;','&gt;','&lt;'), $s);
    // SAME AS htmlspecialchars($s,ENT_NOQUOTES)
}

// example of SAFE XML CONSTRUCTION
function xmlTag( $element, $attribs, $contents = NULL) {
$out = '<' . $element;
foreach( $attribs as $name => $val )
   $out .= ' '.$name.'="'. xmlsafe( $val,1 ) .'"';  // convert quotes
if ( $contents==='' || is_null($contents) )
    $out .= '/>';
else
    $out .= '>'.xmlsafe( $contents )."</$element>";  // not convert quotes
return $out;
}

在CDATA块中你不需要使用这个功能......但是,请避免不加区分地使用CDATA。