首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中生成XML文档(转义字符)

问在PHP中生成XML文档(转义字符)
EN

Stack Overflow用户
提问于 2010-10-18 15:53:28
回答 10查看 73.1K关注 0票数 46

我正在从PHP脚本生成XML文档,并且需要对XML特殊字符进行转义。我知道应该转义的字符列表;但是正确的方法是什么呢?

字符应该只使用反斜杠(\')进行转义,还是正确的方式?有没有什么内置的PHP函数可以帮我处理这个问题?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-10-18 16:00:46

使用XML类生成整个DOM文档。它将处理我们甚至不想关心的编码和解码。

编辑:@Tchalvak批评了:

XML对象创建了一个完整的

文档,它不能轻易地单独编码一个字符串。

这是错误的,DOMDocument可以只正确地输出一个片段,而不是整个文档:

代码语言:javascript
复制
$doc->saveXML($fragment);

这就给出了:

代码语言:javascript
复制
Test &amp; <b> and encode </b> :)
Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

如下所示:

代码语言:javascript
复制
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();

// adding XML verbatim:
$xml = "Test &amp; <b> and encode </b> :)\n";
$fragment->appendXML($xml);

// adding text:
$text = $xml;
$fragment->appendChild($doc->createTextNode($text));

// output the result
echo $doc->saveXML($fragment);

请参阅Demo

票数 35
EN

Stack Overflow用户

发布于 2010-10-18 16:26:40

我创建了一个简单的函数,它使用XML中的five "predefined entities"进行转义:

代码语言:javascript
复制
function xml_entities($string) {
    return strtr(
        $string, 
        array(
            "<" => "&lt;",
            ">" => "&gt;",
            '"' => "&quot;",
            "'" => "&apos;",
            "&" => "&amp;",
        )
    );
}

使用示例Demo

代码语言:javascript
复制
$text = "Test &amp; <b> and encode </b> :)";
echo xml_entities($text);

输出:

代码语言:javascript
复制
Test &amp;amp; &lt;b&gt; and encode &lt;/b&gt; :)

使用str_replace也可以达到类似的效果,但由于使用了双重替换(未经测试,不推荐),因此很脆弱:

代码语言:javascript
复制
function xml_entities($string) {
    return str_replace(
        array("&",     "<",    ">",    '"',      "'"),
        array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;"), 
        $string
    );
}
票数 38
EN

Stack Overflow用户

发布于 2013-02-15 15:46:16

那么htmlspecialchars()函数呢?

代码语言:javascript
复制
htmlspecialchars($input, ENT_QUOTES | ENT_XML1, $encoding);

注意:只有在安装了PHP5.4.0或更高版本的情况下,ENT_XML1标志才可用。

具有这些参数的htmlspecialchars()将替换以下字符:

  • & (与号)变成&amp;
  • " (双引号)变成&quot;
  • ' (单引号)变成&apos;
  • < (小于)变成&lt;
  • > (大于)变成&gt;

您可以使用get_html_translation_table()函数获取转换表。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3957360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档