github.com/wangyougui/gf/v2@v2.6.5/text/gstr/gstr_sub.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gstr
     8  
     9  import "strings"
    10  
    11  // Str returns part of `haystack` string starting from and including
    12  // the first occurrence of `needle` to the end of `haystack`.
    13  //
    14  // This function performs exactly as function SubStr, but to implement the same function
    15  // as PHP: http://php.net/manual/en/function.strstr.php.
    16  //
    17  // Example:
    18  // Str("av.mp4", ".") -> ".mp4"
    19  func Str(haystack string, needle string) string {
    20  	if needle == "" {
    21  		return ""
    22  	}
    23  	pos := strings.Index(haystack, needle)
    24  	if pos == NotFoundIndex {
    25  		return ""
    26  	}
    27  	return haystack[pos+len([]byte(needle))-1:]
    28  }
    29  
    30  // StrEx returns part of `haystack` string starting from and excluding
    31  // the first occurrence of `needle` to the end of `haystack`.
    32  //
    33  // This function performs exactly as function SubStrEx, but to implement the same function
    34  // as PHP: http://php.net/manual/en/function.strstr.php.
    35  //
    36  // Example:
    37  // StrEx("av.mp4", ".") -> "mp4"
    38  func StrEx(haystack string, needle string) string {
    39  	if s := Str(haystack, needle); s != "" {
    40  		return s[1:]
    41  	}
    42  	return ""
    43  }
    44  
    45  // StrTill returns part of `haystack` string ending to and including
    46  // the first occurrence of `needle` from the start of `haystack`.
    47  //
    48  // Example:
    49  // StrTill("av.mp4", ".") -> "av."
    50  func StrTill(haystack string, needle string) string {
    51  	pos := strings.Index(haystack, needle)
    52  	if pos == NotFoundIndex || pos == 0 {
    53  		return ""
    54  	}
    55  	return haystack[:pos+1]
    56  }
    57  
    58  // StrTillEx returns part of `haystack` string ending to and excluding
    59  // the first occurrence of `needle` from the start of `haystack`.
    60  //
    61  // Example:
    62  // StrTillEx("av.mp4", ".") -> "av"
    63  func StrTillEx(haystack string, needle string) string {
    64  	pos := strings.Index(haystack, needle)
    65  	if pos == NotFoundIndex || pos == 0 {
    66  		return ""
    67  	}
    68  	return haystack[:pos]
    69  }
    70  
    71  // SubStr returns a portion of string `str` specified by the `start` and `length` parameters.
    72  // The parameter `length` is optional, it uses the length of `str` in default.
    73  //
    74  // Example:
    75  // SubStr("123456", 1, 2) -> "23"
    76  func SubStr(str string, start int, length ...int) (substr string) {
    77  	strLength := len(str)
    78  	if start < 0 {
    79  		if -start > strLength {
    80  			start = 0
    81  		} else {
    82  			start = strLength + start
    83  		}
    84  	} else if start > strLength {
    85  		return ""
    86  	}
    87  	realLength := 0
    88  	if len(length) > 0 {
    89  		realLength = length[0]
    90  		if realLength < 0 {
    91  			if -realLength > strLength-start {
    92  				realLength = 0
    93  			} else {
    94  				realLength = strLength - start + realLength
    95  			}
    96  		} else if realLength > strLength-start {
    97  			realLength = strLength - start
    98  		}
    99  	} else {
   100  		realLength = strLength - start
   101  	}
   102  
   103  	if realLength == strLength {
   104  		return str
   105  	} else {
   106  		end := start + realLength
   107  		return str[start:end]
   108  	}
   109  }
   110  
   111  // SubStrRune returns a portion of string `str` specified by the `start` and `length` parameters.
   112  // SubStrRune considers parameter `str` as unicode string.
   113  // The parameter `length` is optional, it uses the length of `str` in default.
   114  //
   115  // Example:
   116  // SubStrRune("一起学习吧!", 2, 2) -> "学习"
   117  func SubStrRune(str string, start int, length ...int) (substr string) {
   118  	// Converting to []rune to support unicode.
   119  	var (
   120  		runes       = []rune(str)
   121  		runesLength = len(runes)
   122  	)
   123  
   124  	strLength := runesLength
   125  	if start < 0 {
   126  		if -start > strLength {
   127  			start = 0
   128  		} else {
   129  			start = strLength + start
   130  		}
   131  	} else if start > strLength {
   132  		return ""
   133  	}
   134  	realLength := 0
   135  	if len(length) > 0 {
   136  		realLength = length[0]
   137  		if realLength < 0 {
   138  			if -realLength > strLength-start {
   139  				realLength = 0
   140  			} else {
   141  				realLength = strLength - start + realLength
   142  			}
   143  		} else if realLength > strLength-start {
   144  			realLength = strLength - start
   145  		}
   146  	} else {
   147  		realLength = strLength - start
   148  	}
   149  	end := start + realLength
   150  	if end > runesLength {
   151  		end = runesLength
   152  	}
   153  	return string(runes[start:end])
   154  }
   155  
   156  // StrLimit returns a portion of string `str` specified by `length` parameters, if the length
   157  // of `str` is greater than `length`, then the `suffix` will be appended to the result string.
   158  //
   159  // Example:
   160  // StrLimit("123456", 3)      -> "123..."
   161  // StrLimit("123456", 3, "~") -> "123~"
   162  func StrLimit(str string, length int, suffix ...string) string {
   163  	if len(str) < length {
   164  		return str
   165  	}
   166  	suffixStr := defaultSuffixForStrLimit
   167  	if len(suffix) > 0 {
   168  		suffixStr = suffix[0]
   169  	}
   170  	return str[0:length] + suffixStr
   171  }
   172  
   173  // StrLimitRune returns a portion of string `str` specified by `length` parameters, if the length
   174  // of `str` is greater than `length`, then the `suffix` will be appended to the result string.
   175  // StrLimitRune considers parameter `str` as unicode string.
   176  //
   177  // Example:
   178  // StrLimitRune("一起学习吧!", 2)      -> "一起..."
   179  // StrLimitRune("一起学习吧!", 2, "~") -> "一起~"
   180  func StrLimitRune(str string, length int, suffix ...string) string {
   181  	runes := []rune(str)
   182  	if len(runes) < length {
   183  		return str
   184  	}
   185  	suffixStr := defaultSuffixForStrLimit
   186  	if len(suffix) > 0 {
   187  		suffixStr = suffix[0]
   188  	}
   189  	return string(runes[0:length]) + suffixStr
   190  }
   191  
   192  // SubStrFrom returns a portion of string `str` starting from first occurrence of and including `need`
   193  // to the end of `str`.
   194  //
   195  // Example:
   196  // SubStrFrom("av.mp4", ".") -> ".mp4"
   197  func SubStrFrom(str string, need string) (substr string) {
   198  	pos := Pos(str, need)
   199  	if pos < 0 {
   200  		return ""
   201  	}
   202  	return str[pos:]
   203  }
   204  
   205  // SubStrFromEx returns a portion of string `str` starting from first occurrence of and excluding `need`
   206  // to the end of `str`.
   207  //
   208  // Example:
   209  // SubStrFromEx("av.mp4", ".") -> "mp4"
   210  func SubStrFromEx(str string, need string) (substr string) {
   211  	pos := Pos(str, need)
   212  	if pos < 0 {
   213  		return ""
   214  	}
   215  	return str[pos+len(need):]
   216  }
   217  
   218  // SubStrFromR returns a portion of string `str` starting from last occurrence of and including `need`
   219  // to the end of `str`.
   220  //
   221  // Example:
   222  // SubStrFromR("/dev/vda", "/") -> "/vda"
   223  func SubStrFromR(str string, need string) (substr string) {
   224  	pos := PosR(str, need)
   225  	if pos < 0 {
   226  		return ""
   227  	}
   228  	return str[pos:]
   229  }
   230  
   231  // SubStrFromREx returns a portion of string `str` starting from last occurrence of and excluding `need`
   232  // to the end of `str`.
   233  //
   234  // Example:
   235  // SubStrFromREx("/dev/vda", "/") -> "vda"
   236  func SubStrFromREx(str string, need string) (substr string) {
   237  	pos := PosR(str, need)
   238  	if pos < 0 {
   239  		return ""
   240  	}
   241  	return str[pos+len(need):]
   242  }