重新转义 XML 文件中的字符

Re-escape characters in an XML file

考虑以下 XML 结构(在本例中,它是一个 RSS 提要)

<feed xmlns="http://www.w3.org/2005/Atom">
<link href="http://example.com/atom/" rel="self" type="application/rss+xml"/>
<link rel="alternate" href="http://example.com/" type="text/html"/>
<title type="text">Example RSS feed</title>
<updated>2019-07-27T13:59:14-04:00</updated>
<subtitle>Example</subtitle>
<icon>http://example.com/favicon-32x32.png</icon>
<logo>http://example.com/logo.png</logo>
<rights>© 2019 Example</rights>
<author>
<name>Keanu Reeves</name>
<email>me@example.com</email>
<uri>http://example.com</uri>
</author>
<id>http://example.com/</id>
<entry>
<title>Example post</title>
<id>http://example.com/post/example</id>
<link rel="alternate" href="http://example.com/post/example"/>
<summary type="html">
Description of post. (Preview thing)
</summary>
<updated>2019-07-27T13:59:14-04:00</updated>
<author>
<name>Keanu Reeves</name>
</author>
</entry>
</feed>

如果另存为 .atom 文件,则可以完美运行。

不过,我想在我的 post summary 中包含以下内容:

Example text, blah blah blah. <a href="/post/example">Read more...</a>
The above links get interpreted as litteral HTML when escaped correctly using the function under this code snippet. Good!
Now, heres litteral "<" and ">" characters.... <><><<<>>

显然,我要包含的最后一行使 .atom 文件无效。所以我使用以下 PHP 函数将最后一行编码为 XML 兼容:

echo htmlentities("Now, heres litteral \"<\" and \">\" characters.... <><><<<>>",ENT_XML1);

输出了以下文本:

Now, heres litteral "&lt;" and "&gt;" characters.... &lt;&gt;&lt;&gt;&lt;&lt;&lt;&gt;&gt;

但是现在,我所有的提要阅读器(chrome 的 Slick RSS 和 android 的 FeedR)都将上面的内容解释为文字 HTML!

那么我怎样才能重新转义那些呢?

干杯:)

因为当 XML 文档被解析时,该字段的内容仍然包含文字 <> [可能还有其他] 元字符。

// the literal string you want to encode.
$string1 = "Now, heres litteral \"<\" and \">\" characters.... <><><<<>>";

// oops but I want to make sure I don't accidentally pass in HTML to RSS readers that might
// accidentally try to render it.
$string2 = htmlentities($string1);

// oh also I am writing XML directly instead of using a proper library to generate the document.
// I know that this is a really bad idea, but I'm sure I have my reasons.
// anywho, I should escape this text to be kludged directly into an XML doc.
$string3 = htmlentities($string2, ENT_XML1);

var_dump($string1, $string2, $string3);

输出:

string(56) "Now, heres litteral "<" and ">" characters.... <><><<<>>"
string(109) "Now, heres litteral &quot;&lt;&quot; and &quot;&gt;&quot; characters.... &lt;&gt;&lt;&gt;&lt;&lt;&lt;&gt;&gt;"
string(169) "Now, heres litteral &amp;quot;&amp;lt;&amp;quot; and &amp;quot;&amp;gt;&amp;quot; characters.... &amp;lt;&amp;gt;&amp;lt;&amp;gt;&amp;lt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;"

$string2 如果您将数据输入 XMLDocument、DomDocument 或类似对象之类的对象,则应按需要进行编码,但因为它看起来像是您在做事你将不得不一路走到 $string3.

您定义 summary 内的片段是 HTML 片段。

<summary type="html">
Description of post. (Preview thing)
</summary>

Atom 支持 type 属性来定义内容的处理方式。它甚至可以像视频一样编码为二进制内容。

类型html读取节点的文本内容并将其呈现为HTML片段。 text 读取文本内容并输出为纯文本。 xhtml 渲染后代节点。