如何在golang中椭圆截断文本?

我希望能够干净地剪切大于一定数量字符的段落,而不会在中间剪切一个单词。


所以例如这个:


一个早已确立的事实是,读者在查看页面布局时会被页面的可读内容分散注意力。使用 Lorem Ipsum 的重点在于它具有或多或少的正态分布字母,而不是使用“这里的内容,这里的内容”,使它看起来像可读的英语。


应该变成:


读者会被可读的内容分散注意力,这是一个早已确立的事实......


这是我想出的功能:


 func truncateText(s string, max int) string {

    if len(s) > max {

        r := 0

        for i := range s {

            r++

            if r > max {

                return s[:i]

            }

        }

    }

    return s

}

但它只是粗暴地削减了文本。我想知道如何修改(或用更好的解决方案替换它)以椭圆地剪切文本?


30秒到达战场
浏览 163回答 3
3回答

料青山看我应如是

切片字符串可能会出现问题,因为切片适用于字节,而不是符文。然而,范围适用于符文:lastSpaceIx:=-1len:=0for i,r:=range str {  if unicode.IsSpace(r) {     lastSpaceIx=i  }  len++  if len>=max {    if lastSpaceIx!=-1 {        return str[:lastSpaceIx]+"..."    }    // If here, string is longer than max, but has no spaces  }}// If here, string is shorter than max

POPMUISE

范围是完全没有必要的;就像现在一样,您的整个功能可能只是:func truncateText(s string, max int) string {    return s[:max]}这太简单了,它甚至不应该是一个函数;但当然它也会切断你说你不想要的单词。因此,您可以:func truncateText(s string, max int) string {    if max > len(s) {        return s    }    return s[:strings.LastIndex(s[:max]," ")]}或者,如果您想使用多个字符作为单词边界而不仅仅是空格:func truncateText(s string, max int) string {    if max > len(s) {        return s    }    return s[:strings.LastIndexAny(s[:max]," .,:;-")]}

精慕HU

要根据空格等进行拆分,可以使用 regex :func splitString(str string) []string {    re := regexp.MustCompile("[\\s\\n\\t\\r ]+") //split according to \s, \t, \r, \t and whitespace. Edit this regex for other 'conditions'    split := re.Split(str, -1)    return split}func main() {    var s = "It is a long\nestablished fact that a reader\nwill\nbe distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."    var maxLen = 40    arr := splitString(s)    totalLen := 0    finalStr := ``    for _, each := range arr {        if (totalLen + len(each) > maxLen) {            fmt.Print(strings.TrimSpace(finalStr) + `...`)            break        }        totalLen += len(each)        finalStr += each + ` `    }}//老2您可以执行以下操作:将字符串拆分为切片并循环遍历切片,直到字符串的总长度高于最大允许长度。    var s = "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."    var maxLen = 30    arr := strings.SplitAfter(s, ` `)    totalLen := 0    finalStr := ``    for _, each := range arr {        if (totalLen + len(each) > maxLen) {            fmt.Print(strings.TrimSpace(finalStr) + `...`)            break        }        totalLen += len(each)        finalStr += each    }这是一个早已确立的事实……//旧的错误答案您必须使用字符串和切片:    var s = "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."    newS := s[:30 - 3]     newS += `...`    fmt.Print(newS)结果 :It is a long established fa...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go