2011-03-22 66 views
8

我正在使用Scala和Lift框架開發Web應用程序。我在數據庫記錄包含從Scala中去除HTML標籤字符串

<b>Hi all, this is perex</b> 

頁面的HTML perex而在一個場景中,我需要打印用戶這個perex,但不包含HTML標籤。

Hi all, this is perex 

在Scala中可以這樣做嗎?因爲我試圖用Google來看,但沒有成功。

感謝所有回覆。

回答

8

如果字符串是有效的XML,那麼你可以使用:

scala.xml.XML.loadString("<b>Hi all, this is parex</b>").text

如果它不是有效的XML,那麼你可以使用scala.util.matching.Regex或HTML解析庫像http://jsoup.org/

+0

我使用您的解決方案,現在,它似乎它的工作原理。我不得不將我的字符串打包成標籤,即使使用「名稱」字符串也可以工作。非常感謝。 – kajo 2011-03-22 18:33:12

+4

我寧願使用'scala.xml.parsing.XhtmlParser'來解析HTML。更好地解析它的機會。 – 2011-03-22 19:51:49

0

最好的解決方案我發現是使用cyberneko來解析你的字符串,並做一些「聰明」的SAX事件處理。

cyberneko會解析你的HTML,即使它是無效的,這對於你可能在野外遇到的絕大多數HTML來說都是如此。

如果您註冊一個自定義ContentHandler,基本上忽略所有,但character事件,只是追加到那些一個字符串生成器,你會得到一個良好的第一近似,有一個惱人的缺陷:由一個塊級元素分離的話會結束級聯(for<br/>example =>forexample)。

更好的解決方法是獲取所有塊元素的列表,並讓您的ContentHandler收聽startElement事件。如果元素是塊,那麼只需在字符串構建器中添加一個空格字符。

請注意,雖然這似乎工作正常,它可能不適合您的使用情況。例如,<br/>沒有變成換行符。不過,如果需要添加它,應該不會有太多工作要做。

0

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) 
相關問題