从Scala String中删除HTML标记

时间:2011-03-22 14:13:54

标签: parsing scala string lift strip-tags

我正在使用Scala和Lift框架开发Web应用程序。我在DB中有记录,其中包含页面

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

在一种情况下,我需要打印给用户这个perex,但没有html标签。

Hi all, this is perex

可以在Scala中执行此操作吗?因为我试图与谷歌合作,但没有成功。

感谢所有回复。

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:0)

我发现的最佳解决方案是使用cyberneko来解析你的字符串并做一些&#34;聪明的&#34; SAX事件处理。

cyberneko会解析您的HTML,即使它无效,对于您可能在野外遇到的绝大多数HTML都是如此。

如果您注册一个自定义ContentHandler基本上忽略除character事件之外的所有事件,只需将它们附加到字符串构建器,那么您将获得良好的初步近似值,并存在令人讨厌的缺陷:由块元素分隔的单词将最终连接在一起(for<br/>example =&gt; forexample)。

更好的解决方案是获取所有块元素的列表,并让ContentHandler收听startElement个事件。如果元素是块1,则只需在字符串构建器中附加空格字符。

请注意,虽然这似乎工作正常,但它可能不适合您的用例。例如,<br/>不会变成换行符。如果需要的话,添加它不应该是太多的工作。

答案 2 :(得分:0)

TagSoup应满足您解析realworld 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)