mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
243 lines
6.3 KiB
Go
243 lines
6.3 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gstr
|
|
|
|
import "strings"
|
|
|
|
// Str returns part of `haystack` string starting from and including
|
|
// the first occurrence of `needle` to the end of `haystack`.
|
|
//
|
|
// This function performs exactly as function SubStr, but to implement the same function
|
|
// as PHP: http://php.net/manual/en/function.strstr.php.
|
|
//
|
|
// Example:
|
|
// Str("av.mp4", ".") -> ".mp4"
|
|
func Str(haystack string, needle string) string {
|
|
if needle == "" {
|
|
return ""
|
|
}
|
|
pos := strings.Index(haystack, needle)
|
|
if pos == NotFoundIndex {
|
|
return ""
|
|
}
|
|
return haystack[pos+len([]byte(needle))-1:]
|
|
}
|
|
|
|
// StrEx returns part of `haystack` string starting from and excluding
|
|
// the first occurrence of `needle` to the end of `haystack`.
|
|
//
|
|
// This function performs exactly as function SubStrEx, but to implement the same function
|
|
// as PHP: http://php.net/manual/en/function.strstr.php.
|
|
//
|
|
// Example:
|
|
// StrEx("av.mp4", ".") -> "mp4"
|
|
func StrEx(haystack string, needle string) string {
|
|
if s := Str(haystack, needle); s != "" {
|
|
return s[1:]
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// StrTill returns part of `haystack` string ending to and including
|
|
// the first occurrence of `needle` from the start of `haystack`.
|
|
//
|
|
// Example:
|
|
// StrTill("av.mp4", ".") -> "av."
|
|
func StrTill(haystack string, needle string) string {
|
|
pos := strings.Index(haystack, needle)
|
|
if pos == NotFoundIndex || pos == 0 {
|
|
return ""
|
|
}
|
|
return haystack[:pos+1]
|
|
}
|
|
|
|
// StrTillEx returns part of `haystack` string ending to and excluding
|
|
// the first occurrence of `needle` from the start of `haystack`.
|
|
//
|
|
// Example:
|
|
// StrTillEx("av.mp4", ".") -> "av"
|
|
func StrTillEx(haystack string, needle string) string {
|
|
pos := strings.Index(haystack, needle)
|
|
if pos == NotFoundIndex || pos == 0 {
|
|
return ""
|
|
}
|
|
return haystack[:pos]
|
|
}
|
|
|
|
// SubStr returns a portion of string `str` specified by the `start` and `length` parameters.
|
|
// The parameter `length` is optional, it uses the length of `str` in default.
|
|
//
|
|
// Example:
|
|
// SubStr("123456", 1, 2) -> "23"
|
|
func SubStr(str string, start int, length ...int) (substr string) {
|
|
strLength := len(str)
|
|
if start < 0 {
|
|
if -start > strLength {
|
|
start = 0
|
|
} else {
|
|
start = strLength + start
|
|
}
|
|
} else if start > strLength {
|
|
return ""
|
|
}
|
|
realLength := 0
|
|
if len(length) > 0 {
|
|
realLength = length[0]
|
|
if realLength < 0 {
|
|
if -realLength > strLength-start {
|
|
realLength = 0
|
|
} else {
|
|
realLength = strLength - start + realLength
|
|
}
|
|
} else if realLength > strLength-start {
|
|
realLength = strLength - start
|
|
}
|
|
} else {
|
|
realLength = strLength - start
|
|
}
|
|
|
|
if realLength == strLength {
|
|
return str
|
|
} else {
|
|
end := start + realLength
|
|
return str[start:end]
|
|
}
|
|
}
|
|
|
|
// SubStrRune returns a portion of string `str` specified by the `start` and `length` parameters.
|
|
// SubStrRune considers parameter `str` as unicode string.
|
|
// The parameter `length` is optional, it uses the length of `str` in default.
|
|
//
|
|
// Example:
|
|
// SubStrRune("一起学习吧!", 2, 2) -> "学习"
|
|
func SubStrRune(str string, start int, length ...int) (substr string) {
|
|
// Converting to []rune to support unicode.
|
|
var (
|
|
runes = []rune(str)
|
|
runesLength = len(runes)
|
|
)
|
|
|
|
strLength := runesLength
|
|
if start < 0 {
|
|
if -start > strLength {
|
|
start = 0
|
|
} else {
|
|
start = strLength + start
|
|
}
|
|
} else if start > strLength {
|
|
return ""
|
|
}
|
|
realLength := 0
|
|
if len(length) > 0 {
|
|
realLength = length[0]
|
|
if realLength < 0 {
|
|
if -realLength > strLength-start {
|
|
realLength = 0
|
|
} else {
|
|
realLength = strLength - start + realLength
|
|
}
|
|
} else if realLength > strLength-start {
|
|
realLength = strLength - start
|
|
}
|
|
} else {
|
|
realLength = strLength - start
|
|
}
|
|
end := start + realLength
|
|
if end > runesLength {
|
|
end = runesLength
|
|
}
|
|
return string(runes[start:end])
|
|
}
|
|
|
|
// StrLimit returns a portion of string `str` specified by `length` parameters, if the length
|
|
// of `str` is greater than `length`, then the `suffix` will be appended to the result string.
|
|
//
|
|
// Example:
|
|
// StrLimit("123456", 3) -> "123..."
|
|
// StrLimit("123456", 3, "~") -> "123~"
|
|
func StrLimit(str string, length int, suffix ...string) string {
|
|
if len(str) < length {
|
|
return str
|
|
}
|
|
suffixStr := defaultSuffixForStrLimit
|
|
if len(suffix) > 0 {
|
|
suffixStr = suffix[0]
|
|
}
|
|
return str[0:length] + suffixStr
|
|
}
|
|
|
|
// StrLimitRune returns a portion of string `str` specified by `length` parameters, if the length
|
|
// of `str` is greater than `length`, then the `suffix` will be appended to the result string.
|
|
// StrLimitRune considers parameter `str` as unicode string.
|
|
//
|
|
// Example:
|
|
// StrLimitRune("一起学习吧!", 2) -> "一起..."
|
|
// StrLimitRune("一起学习吧!", 2, "~") -> "一起~"
|
|
func StrLimitRune(str string, length int, suffix ...string) string {
|
|
runes := []rune(str)
|
|
if len(runes) < length {
|
|
return str
|
|
}
|
|
suffixStr := defaultSuffixForStrLimit
|
|
if len(suffix) > 0 {
|
|
suffixStr = suffix[0]
|
|
}
|
|
return string(runes[0:length]) + suffixStr
|
|
}
|
|
|
|
// SubStrFrom returns a portion of string `str` starting from first occurrence of and including `need`
|
|
// to the end of `str`.
|
|
//
|
|
// Example:
|
|
// SubStrFrom("av.mp4", ".") -> ".mp4"
|
|
func SubStrFrom(str string, need string) (substr string) {
|
|
pos := Pos(str, need)
|
|
if pos < 0 {
|
|
return ""
|
|
}
|
|
return str[pos:]
|
|
}
|
|
|
|
// SubStrFromEx returns a portion of string `str` starting from first occurrence of and excluding `need`
|
|
// to the end of `str`.
|
|
//
|
|
// Example:
|
|
// SubStrFromEx("av.mp4", ".") -> "mp4"
|
|
func SubStrFromEx(str string, need string) (substr string) {
|
|
pos := Pos(str, need)
|
|
if pos < 0 {
|
|
return ""
|
|
}
|
|
return str[pos+len(need):]
|
|
}
|
|
|
|
// SubStrFromR returns a portion of string `str` starting from last occurrence of and including `need`
|
|
// to the end of `str`.
|
|
//
|
|
// Example:
|
|
// SubStrFromR("/dev/vda", "/") -> "/vda"
|
|
func SubStrFromR(str string, need string) (substr string) {
|
|
pos := PosR(str, need)
|
|
if pos < 0 {
|
|
return ""
|
|
}
|
|
return str[pos:]
|
|
}
|
|
|
|
// SubStrFromREx returns a portion of string `str` starting from last occurrence of and excluding `need`
|
|
// to the end of `str`.
|
|
//
|
|
// Example:
|
|
// SubStrFromREx("/dev/vda", "/") -> "vda"
|
|
func SubStrFromREx(str string, need string) (substr string) {
|
|
pos := PosR(str, need)
|
|
if pos < 0 {
|
|
return ""
|
|
}
|
|
return str[pos+len(need):]
|
|
}
|