2010-02-02 54 views
2

我有HTML以下塊:如何在使用ColdFusion函數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()爲了將<轉換爲&lt;>轉換爲&gt;,這很好。不幸的是,它也將&mdash;轉換爲&amp;mdash;,這是無效的,並在CFXML標記中引發異常。

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

我該如何解決這個問題?

+0

數據庫中存儲的HTML塊是否與XHTML兼容? – AnthonyWJones 2010-02-04 16:12:30

+0

不,HTML內容無效XHTML – 2010-02-05 04:26:40

回答

1

這是艱難的,當你有一些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> 

如果有效,可以通過將此邏輯封裝在一個函數中來完成這一步。

1

如何在源字符串中簡單地不使用&mdash;轉義,而是包括原位字符—。

編輯

我要去猜測,存儲在數據庫中的HTML內容不知道是XHTML兼容,因此把它在XML文檔中,你別無選擇,只能要麼把它在CDATA部分或正確編碼。有一個假設,把它放在這樣的XML文檔中是有用的,並且它可以在消費端被正確解碼。如果在消費者中使用典型的XML DOM,這兩種方法都是正確的。

所以這導致我這個問題,最新怎麼回事&amp;mdash?畢竟<將導致&lt;等。當由消費者從DOM檢索時,得到的字符串將被返回到使用&mdash;<等等,當隨後用作HTML時,一切都會好的。

+0

這是我無法編輯的客戶端的現有內容。 – 2010-02-04 15:41:15

8

您有幾個選項。很大程度上取決於如何使用這些內容。包含所需的輸出文檔以及指示正在使用這個xml的位置會非常有幫助。

如果你不想用HTML的內容混亂的一切,你總是可以使用CDATA,像這樣:

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

另外,我知道你說你不想轉換剩餘的&符號,但我不明白這是怎麼回事。 HTML內容是您想要處理的字符串 - 在這種情況下,所有內容都應該被轉義以便稍後可以轉義 - 或者您希望成爲文檔一部分的有效XML。我的意思是,當您稍後處理<content>標記的內容時,如果「&」字符未轉義,則會遇到問題。

+0

我將內容從SQL Server數據庫中取出並放入XML文檔中,以便可以將其導入到CMS中(以及許多其他元數據)。 CDATA不是一個選項.... – 2010-02-04 15:40:36

+0

@Eric:爲什麼CDATA不是一個選項? – AnthonyWJones 2010-02-04 16:11:33

+0

什麼樣的CMS?基本上這些都沒有意義。如果您要導入文本,則必須全部轉義,包括&emdash ;. & mdash;是完全有效的,不應該在CFXML標籤中引發異常。你可能做錯了什麼。 – 2010-02-04 16:41:27

0

目前,我只是簡單地用「&lt;」和「&gt;」替換所有小於和大於的字符。

0

在這個特定的用例中,可以使用URLEncodedFormat()來保留內容的自然形式,然後在出路中使用URLDecode()。

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

我不推薦這是最佳實踐,只是它可以在問題構成的場景下工作。

3

遺憾的是這樣的回答:

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

如果你碰巧有你想要顯示無效的HTML是不夠的。考慮的情況下MYHTML包含:

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

據我可以告訴有在ColdFusion中沒有支持的方式做潛在的無效數據的編碼正確。你最好的選擇是自己寫一個過濾函數,該實體編碼html特殊和非法字符。

0

HTMLEditFormat(string)應該轉換你的小於號和大於號的符號,但也會處理符號。我明白你想離開& mdash;原樣。值得指出的是,& mdash;不是XML的predefined entities(儘管你可以定義它)。

我只是覺得我會提到它,因爲HTMLEditFormat()非常適用於轉義HTML以包含在XML文檔中,比如Atom提要。但是,這聽起來並不是你的具體用例的解決方案。

相關問題