php - 在 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 "<" and ">" characters.... <><><<<>>
但是现在,我所有的提要阅读器(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 "<" and ">" characters.... <><><<<>>"
string(169) "Now, heres litteral &quot;&lt;&quot; and &quot;&gt;&quot; characters.... &lt;&gt;&lt;&gt;&lt;&lt;&lt;&gt;&gt;"
$string2
如果您将数据输入到 XMLDocument、DomDocument 或类似对象之类的东西中,则应该按照必要的方式进行编码,但是由于看起来您正在以艰难的方式做事,因此您将不得不一路走下去$string3
.
推荐阅读
- common-lisp - 如何将 DEFCFUN 与指向外部 C 函数的指针一起使用?
- java - Spring Boot JPA 通过自定义字符串字段查找
- java - 使用 VSCode 在 python 中导入自定义模块的问题
- android - Google Play 控制台发布到封闭 Alpha 版而不是生产版
- grep - 有没有办法在 Splunk 中实现之前/之后的事件,或在报告中实现实时事件流?
- design-patterns - 什么情况下应该设计成迭代器
- javascript - 如何从数据表搜索中禁用实时搜索?
- regex - 从 MongoDB 正则表达式中排除字符串
- reactjs - Race Condition:Material-UI Select 在执行条件渲染生成 MenuItem 时认为值超出范围
- apache-kafka - Kafka - 自动提交是在后台发生还是作为轮询循环的一部分