簡體   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