scala中的多标签系统与播放框架

时间:2013-11-24 05:03:20

标签: scala playframework-2.0

我正在使用scala和play framework。我想制作像twitter这样的哈希标签系统。但是在多哈希标签的情况下我遇到了问题。 这是我的控制器代码..

 def hashTag = Action{ implicit request =>
      val body = request.body.asFormUrlEncoded
      var textValue=body.get("text").get(0) //get text value from post method
      textValue = textValue.trim()
      val array = textValue.split(" ")      //split from 'space' to get first word
      val firstWord = array(0)
      if (firstWord.length() > 1) {
         val split = firstWord.split("#")   //split word from #
         if (split.length >= 2) {
            val hashTag = split(1)          //fetch first hash-tag from textValue variable
            val link = "<a href=\"/hashtag/" + hashTag + "\">" + hashTag + "</a>" //create a link to hash-tag page
            textValue=textValue.replace(hashTag, link)

             //Insert textValue in database
            }//end if
        }//end if
}//end hashTag

如果我给出类似于下面给出的字符串的输入,那么我在Scala hash-tag的两个实例上都获得了超链接,但在Java hash-tag上没有。我想用&lt;替换Java hash-tag a href ='/ hashtag / Java'&gt; Java并存储在数据库中。

#scala #java #scala

我该怎么办,请帮忙。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码未运行,因为您实际上没有循环遍历所有主题标签。它只需要找到它找到的第一个hashtag并替换字符串中的那个,并且不会继续到下一个。

如果您使用Regular Expressions,您的解决方案可以大大简化。您可以定义与主题标签匹配的正则表达式:#(\w+)。在正则表达式中\w+表示我们匹配单词字符,而#(\w+)表示我们在#符号后面匹配单词字符。如果您还想支持数字,请按以下方式使用\d进行扩展:#([\w\d]+)

在Scala中,正则表达式将按以下方式使用:

val textValue: String = "#scala #java #scala"  // Our strings we're testing
val hashTagPattern: Regex = """#(\w+)""".r     // The regular expression we defined
val textWithLinks: String = hashTagPattern.replaceAllIn(textValue, { m =>
  val hashTag = m.group(1)  // Group 1 is referencing the characters in the parentheses
  s"""<a href="/hashtag/$hashTag">$hashTag</a>"""       // We assemble the link using string interpolation
})
println(textWithLinks)
// Output: <a href="/hashtag/scala">scala</a> <a href="/hashtag/java">java</a> <a href="/hashtag/scala">scala</a>

所以我们定义一个hashTagPattern然后调用replaceAllIn,它带有两个参数:要替换的字符串和处理Match的函数。此函数的类型定义为:Match => String

接下来我们创建此函数:m是我们的匹配,我们使用.group(1)来获取#符号后面的#标签字符串。在我们完成后,我们可以使用string literals """..."""来避免字符串,string interpolation将我们的链接与$variableName汇总在我们的字符串中。