我正在使用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
我该怎么办,请帮忙。提前谢谢。
答案 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
汇总在我们的字符串中。