我有以下HTML块:
<p>The quick brown fox jumps over the lazy dog — The quick brown fox jumps over the lazy dog.</p>
<p>The quick brown fox jumps over the lazy dog — The quick brown fox jumps over the lazy dog.
<br>The quick brown fox jumps over the lazy dog — The quick brown fox jumps over the lazy dog.
它不是有效的XHTML。但是,我需要将此HTML包含在XML文档中。我尝试使用XMLFormat()
将<
转换为<
,将>
转换为>
,效果很好。不幸的是,它还将—
转换为&mdash;
,这是无效的,并在CFXML标记中引发异常。
<cfxml variable="myXML">
<content>#XMLFormat(myHTML)#</content>
</cfxml>
我该如何解决这个问题?
答案 0 :(得分:8)
您有几个选择。很大程度上取决于如何使用这些内容。包含所需的输出文档以及指示此xml的使用位置非常有用。
如果您根本不想弄乱HTML的内容,可以随时使用CDATA,如下所示:
<cfxml variable="myXML">
<content><![CDATA[#myHTML#]]></content>
</cfxml>
另外,我知道你说你不想转换剩余的&符号,但我不知道这是怎么回事。 HTML内容是您要处理的字符串 - 在这种情况下,所有内容都应该被转义以便以后可以转义 - 或者它是您希望成为文档一部分的有效XML。我的意思是,当您稍后处理<content>
标记的内容时,如果“&”符号未被转义,则会遇到问题。
答案 1 :(得分:3)
不幸的是这个答案:
<cfxml variable="myXML">
<content><![CDATA[#myHTML#]]></content>
</cfxml>
如果您碰巧要显示无效的html,则不足。考虑myHTML包含的情况:
<p>some invalid html ]]><script>alert('foo')</script>
据我所知,coldfusion中没有支持的方法来对潜在的无效数据进行正确的编码。你最好的办法是给自己写一个过滤函数,实体编码html特殊和非法字符。
答案 2 :(得分:1)
当你有一些部分转换的HTML时很难,然后需要做其余的事情......
您可以替换所有“&amp;”暂时签名,运行XMLFormat,然后转换“&amp;”签回来。
<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>
如果它有效,你可以通过将这个逻辑包装在一个函数中来实现这一步。
答案 3 :(得分:1)
如何简单地不在源字符串中使用—
转义,而是在原位包含 - 字符。
修改强>:
我猜测存储在数据库中的HTML内容不知道是否符合XHTML,因此要将它放在XML文档中,您别无选择,只能将其放在CDATA部分或正确编码。假设将它放在这样的XML文档中是有用的,并且可以在消费端正确解码。如果在消费者处使用典型的XML DOM,则这种方法都适用。
所以这引出了我的问题,&mdash
实际上是错的?所有<
将导致<
等。当消费者从DOM检索时,生成的字符串将返回使用—
和<
,依此类推用作HTML的一切都会很好。
答案 4 :(得分:0)
目前,我只是分别用“<
”和“>
”替换所有小于和大于字符的字符。
答案 5 :(得分:0)
在这个特定用例中,您可以使用URLEncodedFormat()来保留内容的自然形式,然后在出路时使用URLDecode()。
<cfxml variable="content">
<content><cfoutput>#URLEncodedFormat(myHTML)#</cfoutput></content>
</cfxml>
<cfset xml = xmlParse(content)>
<cfoutput>#URLDecode(xml.content.xmltext)#</cfoutput>
我不建议将此作为最佳做法,只是它可以在问题提出的场景中起作用。
答案 6 :(得分:0)
HTMLEditFormat(string)应该转换小于号和大于号的符号,但也会处理&符号。我知道您希望按原样保留&amp; mdash; 。值得指出的是,&amp; mdash; 不是XML的predefined entities之一(尽管你可以定义它)。
我只是认为我会提到它,因为HTMLEditFormat()非常适合转义HTML以包含在XML文档中,例如Atom提要。但是,听起来它不是您特定用例的解决方案。