如何从PHP的XML输出中转义商标和版权字符

时间:2013-11-21 15:24:22

标签: php xml

我的PHP应用程序正在输出XML文件,某些输出可能包含商标和/或版权字符。有没有办法在输出中转义这些字符?

谢谢!

1 个答案:

答案 0 :(得分:5)

需要在XML中转义的唯一特殊字符是:

  • < - &lt;
  • > - &gt;
  • & - &amp;
  • " - &quot;
  • ' - &apos; / &#39;

您可以在属性值或文本节点中使用转义变体。以下2个示例表示相同的内容。

<foo>&lt;Hello@World&gt;</foo>
<foo><![CDATA[<Hello@World>]]></foo>

<foo/>的nodeValue始终为<Hello@World>

第一个是文本节点,第二个是cdata部分。在cdata部分中,不允许实体,禁止序列]]>。如果CDATA部分包含]]>,则DOM将自动拆分。

如果您没有为XML使用支持Unicode的编码,则只需转义其他特殊字符(如©)。如果需要简单的ASCII XML,可以将特殊字符编写为数字字符引用。该数字是Unicode中字符的代码点。

  • © - &#169; / &#xA9;

模式和DTD可以定义命名的字符实体引用。这些在XML中不可用,但可以基于XML的格式提供。 (X)HTML就是一个例子。

  • © - &copy;

如果您使用DOM,它会根据需要进行处理。

在UTF-8中,只会转义XML特殊字符。

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));

echo $dom->saveXml();

输出:

<?xml version="1.0" encoding="UTF-8"?>
<foo>&lt;©€äöü&gt;</foo>

在ASCII中,还会有更多内容被转义:

$dom = new DOMDocument('1.0', 'ASCII');
$dom->appendChild($dom->createElement('foo'));
$dom->documentElement->appendChild($dom->createTextNode('<©€äöü>'));

echo $dom->saveXml();

输出:

<?xml version="1.0" encoding="ASCII"?>
<foo>&lt;&#169;&#8364;&#228;&#246;&#252;&gt;</foo>