123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- // 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`.
- // See http://php.net/manual/en/function.strstr.php.
- // Eg: Str("12345", "3") => "345"
- 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`.
- // Eg: StrEx("12345", "3") => "45"
- 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`.
- // Eg: StrTill("12345", "3") => "123"
- 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`.
- // Eg: StrTillEx("12345", "3") => "12"
- 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.
- // Eg: SubStr("12345", 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.
- 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.
- 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.
- 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`.
- 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`.
- 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`.
- 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`.
- func SubStrFromREx(str string, need string) (substr string) {
- pos := PosR(str, need)
- if pos < 0 {
- return ""
- }
- return str[pos+len(need):]
- }
|