github.com/wangyougui/gf/v2@v2.6.5/text/gstr/gstr_pos.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  // Pos returns the position of the first occurrence of `needle`
    12  // in `haystack` from `startOffset`, case-sensitively.
    13  // It returns -1, if not found.
    14  func Pos(haystack, needle string, startOffset ...int) int {
    15  	length := len(haystack)
    16  	offset := 0
    17  	if len(startOffset) > 0 {
    18  		offset = startOffset[0]
    19  	}
    20  	if length == 0 || offset > length || -offset > length {
    21  		return -1
    22  	}
    23  	if offset < 0 {
    24  		offset += length
    25  	}
    26  	pos := strings.Index(haystack[offset:], needle)
    27  	if pos == NotFoundIndex {
    28  		return NotFoundIndex
    29  	}
    30  	return pos + offset
    31  }
    32  
    33  // PosRune acts like function Pos but considers `haystack` and `needle` as unicode string.
    34  func PosRune(haystack, needle string, startOffset ...int) int {
    35  	pos := Pos(haystack, needle, startOffset...)
    36  	if pos < 3 {
    37  		return pos
    38  	}
    39  	return len([]rune(haystack[:pos]))
    40  }
    41  
    42  // PosI returns the position of the first occurrence of `needle`
    43  // in `haystack` from `startOffset`, case-insensitively.
    44  // It returns -1, if not found.
    45  func PosI(haystack, needle string, startOffset ...int) int {
    46  	length := len(haystack)
    47  	offset := 0
    48  	if len(startOffset) > 0 {
    49  		offset = startOffset[0]
    50  	}
    51  	if length == 0 || offset > length || -offset > length {
    52  		return -1
    53  	}
    54  
    55  	if offset < 0 {
    56  		offset += length
    57  	}
    58  	pos := strings.Index(strings.ToLower(haystack[offset:]), strings.ToLower(needle))
    59  	if pos == -1 {
    60  		return -1
    61  	}
    62  	return pos + offset
    63  }
    64  
    65  // PosIRune acts like function PosI but considers `haystack` and `needle` as unicode string.
    66  func PosIRune(haystack, needle string, startOffset ...int) int {
    67  	pos := PosI(haystack, needle, startOffset...)
    68  	if pos < 3 {
    69  		return pos
    70  	}
    71  	return len([]rune(haystack[:pos]))
    72  }
    73  
    74  // PosR returns the position of the last occurrence of `needle`
    75  // in `haystack` from `startOffset`, case-sensitively.
    76  // It returns -1, if not found.
    77  func PosR(haystack, needle string, startOffset ...int) int {
    78  	offset := 0
    79  	if len(startOffset) > 0 {
    80  		offset = startOffset[0]
    81  	}
    82  	pos, length := 0, len(haystack)
    83  	if length == 0 || offset > length || -offset > length {
    84  		return -1
    85  	}
    86  
    87  	if offset < 0 {
    88  		haystack = haystack[:offset+length+1]
    89  	} else {
    90  		haystack = haystack[offset:]
    91  	}
    92  	pos = strings.LastIndex(haystack, needle)
    93  	if offset > 0 && pos != -1 {
    94  		pos += offset
    95  	}
    96  	return pos
    97  }
    98  
    99  // PosRRune acts like function PosR but considers `haystack` and `needle` as unicode string.
   100  func PosRRune(haystack, needle string, startOffset ...int) int {
   101  	pos := PosR(haystack, needle, startOffset...)
   102  	if pos < 3 {
   103  		return pos
   104  	}
   105  	return len([]rune(haystack[:pos]))
   106  }
   107  
   108  // PosRI returns the position of the last occurrence of `needle`
   109  // in `haystack` from `startOffset`, case-insensitively.
   110  // It returns -1, if not found.
   111  func PosRI(haystack, needle string, startOffset ...int) int {
   112  	offset := 0
   113  	if len(startOffset) > 0 {
   114  		offset = startOffset[0]
   115  	}
   116  	pos, length := 0, len(haystack)
   117  	if length == 0 || offset > length || -offset > length {
   118  		return -1
   119  	}
   120  
   121  	if offset < 0 {
   122  		haystack = haystack[:offset+length+1]
   123  	} else {
   124  		haystack = haystack[offset:]
   125  	}
   126  	pos = strings.LastIndex(strings.ToLower(haystack), strings.ToLower(needle))
   127  	if offset > 0 && pos != -1 {
   128  		pos += offset
   129  	}
   130  	return pos
   131  }
   132  
   133  // PosRIRune acts like function PosRI but considers `haystack` and `needle` as unicode string.
   134  func PosRIRune(haystack, needle string, startOffset ...int) int {
   135  	pos := PosRI(haystack, needle, startOffset...)
   136  	if pos < 3 {
   137  		return pos
   138  	}
   139  	return len([]rune(haystack[:pos]))
   140  }