我正在使用Scala和Lift框架開發Web應用程序。我在數據庫記錄包含從Scala中去除HTML標籤字符串
<b>Hi all, this is perex</b>
頁面的HTML perex而在一個場景中,我需要打印用戶這個perex,但不包含HTML標籤。
Hi all, this is perex
在Scala中可以這樣做嗎?因爲我試圖用Google來看,但沒有成功。
感謝所有回覆。
我正在使用Scala和Lift框架開發Web應用程序。我在數據庫記錄包含從Scala中去除HTML標籤字符串
<b>Hi all, this is perex</b>
頁面的HTML perex而在一個場景中,我需要打印用戶這個perex,但不包含HTML標籤。
Hi all, this is perex
在Scala中可以這樣做嗎?因爲我試圖用Google來看,但沒有成功。
感謝所有回覆。
如果字符串是有效的XML,那麼你可以使用:
scala.xml.XML.loadString("<b>Hi all, this is parex</b>").text
如果它不是有效的XML,那麼你可以使用scala.util.matching.Regex
或HTML解析庫像http://jsoup.org/
最好的解決方案我發現是使用cyberneko來解析你的字符串,並做一些「聰明」的SAX事件處理。
cyberneko會解析你的HTML,即使它是無效的,這對於你可能在野外遇到的絕大多數HTML來說都是如此。
如果您註冊一個自定義ContentHandler
,基本上忽略所有,但character
事件,只是追加到那些一個字符串生成器,你會得到一個良好的第一近似,有一個惱人的缺陷:由一個塊級元素分離的話會結束級聯(for<br/>example
=>forexample
)。
更好的解決方法是獲取所有塊元素的列表,並讓您的ContentHandler
收聽startElement
事件。如果元素是塊,那麼只需在字符串構建器中添加一個空格字符。
請注意,雖然這似乎工作正常,它可能不適合您的使用情況。例如,<br/>
沒有變成換行符。不過,如果需要添加它,應該不會有太多工作要做。
TagSoup應該符合您的要求來解析真實世界的html文件。
SBT的依賴,
libraryDependencies += "org.ccil.cowan.tagsoup" % "tagsoup" % "1.2.1"
示例代碼,
object TagSoupXmlLoader {
private val factory = new SAXFactoryImpl()
def get(): XMLLoader[Elem] = {
XML.withSAXParser(factory.newSAXParser())
}
}
使用,
val root = TagSoupXmlLoader.get().load("http://www.google.com")
println(root)
我使用您的解決方案,現在,它似乎它的工作原理。我不得不將我的字符串打包成標籤,即使使用「嗨名稱」字符串也可以工作。非常感謝。 – kajo 2011-03-22 18:33:12
我寧願使用'scala.xml.parsing.XhtmlParser'來解析HTML。更好地解析它的機會。 – 2011-03-22 19:51:49