首页 > 解决方案 > 在 XML 文件中重新转义字符

问题描述

考虑以下 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 文件,则可以完美运行。

Tho,我想在我的帖子中包含以下内容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!

那么我怎样才能重新逃脱那些呢?

干杯:)

标签: phphtmlxmlrssatom-feed

解决方案


因为当解析 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.


推荐阅读