2010-05-24 68 views

回答

3

事實證明Enlive 確實如果您使用net.cgrand.enlive-html/content將文本放入HTML元素,則默認轉義HTML。

(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>")) 
"<p class=\"c\">&lt;script&gt;&lt;/script&gt;</p>" 
14

更新:我知道必須有比這更...

ring.util.codecring-core有一個叫功能,這工作就像這樣:

user> (require '[ring.util.codec :as c]) 
nil 
user> (c/url-encode "<a>") 
"%3Ca%3E" 
user> (c/url-decode "<a>") 
"<a>" 

這些是包裝器java.net.URLEncoderjava.net.URLDecoder 。基於Apache Commons的一個類,相同的命名空間提供了處理Base64編碼的函數。


原始答案如下。

我不知道是否有公共職能要做到這一點,但Enlive有兩個私有函數調用xml-strattr-str該這樣做:(attr-str也逃脫"

(defn- xml-str 
"Like clojure.core/str but escapes < > and &." 
[x] 
    (-> x str (.replace "&" "&amp;") (.replace "<" "&lt;") (.replace ">" "&gt;"))) 

您可以通過@#'net.cgrand.enlive-html/xml-str(Clojure不傾向於使事情真的私人...)或只是將它複製到您自己的名稱空間。

+0

這有點令人失望。聽起來像是大多數Clojure Web框架中的主要監督。 – 2010-05-24 14:53:59

+1

顯然情況並不那麼糟糕:請參閱最新的答案。:-) – 2010-05-24 15:08:34

+1

看起來我有點倉促責怪Enlive,但無論如何感謝。 :) – 2010-05-25 09:54:40

17

hiccup.util/escape-html in hiccup做到了。這個函數曾經是Compojure本身(因爲hiccup中的所有功能都曾經是Compojure的一部分)。這是一個簡單的功能,你可以很容易地自己寫。

(defn escape-html 
    "Change special characters into HTML character entities." 
    [text] 
    (.. #^String (as-str text) 
    (replace "&" "&amp;") 
    (replace "<" "&lt;") 
    (replace ">" "&gt;") 
    (replace "\"" "&quot;"))) 

還有clojure.contrib.string/escape,這需要地圖炭 - >字符串轉義序列和一個字符串,並逃脫它。

user> (clojure.contrib.string/escape {\< "&lt;" \> "&gt;"} "<div>foo</div>") 
"&lt;div&gt;foo&lt;/div&gt;" 

這令我不是有用,因爲它可能是,因爲你可能想逃跑的多字符序列,這不會讓你。但它可能適用於HTML轉義需求。

然後,當然有很多Java庫。你可以使用StringEscapeUtils從Apache的百科全書:

(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string) 

這令我有點重量級爲此,雖然。

+1

StringEscapeUtils的正確URL http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm 2010-08-27 12:02:46

+0

更新後的網址http://commons.apache.org/proper/commons-朗/ javadocs中/ API-3.1 /組織/阿帕奇/公地/ lang3/StringEscapeUtils.html – 2014-01-22 12:38:19