繁体   English   中英

使用ColdFusion函数XMLFormat()时,如何转义HTML字符实体?

[英]How can I escape HTML character entities when using ColdFusion function XMLFormat()?

我有以下HTML块:

<p>The quick brown fox jumps over the lazy dog &mdash; The quick brown fox jumps over the lazy dog.</p>
<p>The quick brown fox jumps over the lazy dog &mdash; The quick brown fox jumps over the lazy dog.
<br>The quick brown fox jumps over the lazy dog &mdash; The quick brown fox jumps over the lazy dog.

它不是有效的XHTML。 但是,我需要将此HTML包含在XML文档中。 我尝试使用XMLFormat()来转换< to &lt; >&gt; ,效果很好。 不幸的是,它也转换了&mdash; &amp;mdash; ,这是无效的并在CFXML标记中引发异常。

<cfxml variable="myXML">
    <content>#XMLFormat(myHTML)#</content>
</cfxml>

我该如何解决这个问题?

你有几个选择。 很大程度上取决于如何使用这些内容。 包含所需的输出文档以及指示此xml的使用位置非常有用。

如果您根本不想弄乱HTML的内容,您可以随时使用CDATA ,如下所示:

<cfxml variable="myXML">
    <content><![CDATA[#myHTML#]]></content>
</cfxml>

此外,我知道你说你不想转换剩下的&符号,但我只是不知道这是怎么回事。 HTML内容是您要处理的字符串 - 在这种情况下,所有内容都应该被转义以便以后可以转义 - 或者它是您希望成为文档一部分的有效XML。 我的意思是,当您稍后处理<content>标记的<content>时,如果&符号未被转义,您将遇到问题。

不幸的是这个回答

<cfxml variable="myXML">
    <content><![CDATA[#myHTML#]]></content>
</cfxml>

如果你碰巧有想要显示的无效html,那就不够了。 考虑myHTML包含的情况:

<p>some invalid html ]]><script>alert('foo')</script>

据我所知,coldfusion中没有支持的方法来对潜在的无效数据进行正确的编码。 最好的办法是给自己编写一个过滤函数,该函数对实体编码html特殊和非法字符。

当你有一些HTML部分转换时,这很难,然后需要做其余的...

您可以暂时替换所有“&”符号,运行XMLFormat,然后将“&”符号转换回来。

<cfscript>
// replace & signs with a temp placeholder
myHTML = replace(myHTML, "&", "*amp*", "all");

// format for XML
myHTML = XMLFormat(myHTML);

// replace placeholders with & signs
myHTML = replace(myHTML, "*amp*", "&", "all");
</cfscript>

如果它有效,你可以通过将这个逻辑包装在一个函数中来实现这一步。

如何简单地不使用&mdash; 在源字符串中转义,而不是包括?? 原位人物。

编辑

我猜测存储在数据库中的HTML内容不知道是否符合XHTML,因此要将它放在XML文档中,你别无选择,只能将它放在CDATA部分或正确编码。 假设将它放在这样的XML文档中是有用的,并且可以在消费端正确解码。 如果在消费者处使用典型的XML DOM,则这种方法都是如此。

所以这引出了我这个问题,什么是&amp;mdash实际上是错的? 毕竟<将导致&lt; 当消费者从DOM中检索时,结果字符串将返回使用&mdash; <等等,当后来用作HTML时一切都会好的。

HTMLEditFormat(字符串)应该转换小于号和大于号的符号,但也会处理&符号。 我明白你想离开&mdash; 原样。 值得指出的是&mdash; 不是XML的预定义实体之一 (尽管您可以定义它)。

我只是想提一下,因为HTMLEditFormat()非常适合转义HTML以包含在XML文档中,例如Atom提要。 但是,听起来它不是您特定用例的解决方案。

目前,我只是分别用“ &lt; ”和“ &gt; ”替换所有小于和大于字符的字符。

在这个特定的用例中,您可以使用URLEncodedFormat()来保留内容的自然形式,然后在出路时使用URLDecode()。

<cfxml variable="content">
    <content><cfoutput>#URLEncodedFormat(myHTML)#</cfoutput></content>
</cfxml>
<cfset xml = xmlParse(content)>
<cfoutput>#URLDecode(xml.content.xmltext)#</cfoutput>

我不建议将此作为最佳实践,只是它可以在问题提出的场景中起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM