重新转义 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 "<" 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
.
您定义 summary
内的片段是 HTML 片段。
<summary type="html">
Description of post. (Preview thing)
</summary>
Atom 支持 type
属性来定义内容的处理方式。它甚至可以像视频一样编码为二进制内容。
类型html
读取节点的文本内容并将其呈现为HTML片段。 text
读取文本内容并输出为纯文本。 xhtml
渲染后代节点。
考虑以下 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 "<" 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
.
您定义 summary
内的片段是 HTML 片段。
<summary type="html">
Description of post. (Preview thing)
</summary>
Atom 支持 type
属性来定义内容的处理方式。它甚至可以像视频一样编码为二进制内容。
类型html
读取节点的文本内容并将其呈现为HTML片段。 text
读取文本内容并输出为纯文本。 xhtml
渲染后代节点。