297 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package strutil 实现了一些函数来操作字符串
 | ||
| package strutil
 | ||
| 
 | ||
| import (
 | ||
| 	"regexp"
 | ||
| 	"strings"
 | ||
| 	"unicode"
 | ||
| 	"unicode/utf8"
 | ||
| )
 | ||
| 
 | ||
| // CamelCase 转换字符串到驼峰法(CamelCase)
 | ||
| func CamelCase(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	res := ""
 | ||
| 	blankSpace := " "
 | ||
| 	regex, _ := regexp.Compile("[-_&]+")
 | ||
| 	ss := regex.ReplaceAllString(s, blankSpace)
 | ||
| 	for i, v := range strings.Split(ss, blankSpace) {
 | ||
| 		vv := []rune(v)
 | ||
| 		if i == 0 {
 | ||
| 			if vv[i] >= 65 && vv[i] <= 96 {
 | ||
| 				vv[0] += 32
 | ||
| 			}
 | ||
| 			res += string(vv)
 | ||
| 		} else {
 | ||
| 			res += Capitalize(v)
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return res
 | ||
| }
 | ||
| 
 | ||
| // Capitalize 将一个字符串的第一个字符转换为大写,其余的转换为小写
 | ||
| func Capitalize(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	out := make([]rune, len(s))
 | ||
| 	for i, v := range s {
 | ||
| 		if i == 0 {
 | ||
| 			out[i] = unicode.ToUpper(v)
 | ||
| 		} else {
 | ||
| 			out[i] = unicode.ToLower(v)
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return string(out)
 | ||
| }
 | ||
| 
 | ||
| // UpperFirst 将字符串的第一个字符转换为大写
 | ||
| func UpperFirst(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	r, size := utf8.DecodeRuneInString(s)
 | ||
| 	r = unicode.ToUpper(r)
 | ||
| 
 | ||
| 	return string(r) + s[size:]
 | ||
| }
 | ||
| 
 | ||
| // LowerFirst 将字符串的第一个字符转换为小写
 | ||
| func LowerFirst(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	r, size := utf8.DecodeRuneInString(s)
 | ||
| 	r = unicode.ToLower(r)
 | ||
| 
 | ||
| 	return string(r) + s[size:]
 | ||
| }
 | ||
| 
 | ||
| // PadEnd 如果字符串比尺寸短,则将其垫在右侧
 | ||
| // 填充字符如果超过大小,将被截断
 | ||
| func PadEnd(source string, size int, padStr string) string {
 | ||
| 	len1 := len(source)
 | ||
| 	len2 := len(padStr)
 | ||
| 
 | ||
| 	if len1 >= size {
 | ||
| 		return source
 | ||
| 	}
 | ||
| 
 | ||
| 	fill := ""
 | ||
| 	if len2 >= size-len1 {
 | ||
| 		fill = padStr[0 : size-len1]
 | ||
| 	} else {
 | ||
| 		fill = strings.Repeat(padStr, size-len1)
 | ||
| 	}
 | ||
| 	return source + fill[0:size-len1]
 | ||
| }
 | ||
| 
 | ||
| // PadStart 如果字符串比尺寸短,则将其垫在左侧
 | ||
| // 填充字符如果超过大小,将被截断
 | ||
| func PadStart(source string, size int, padStr string) string {
 | ||
| 	len1 := len(source)
 | ||
| 	len2 := len(padStr)
 | ||
| 
 | ||
| 	if len1 >= size {
 | ||
| 		return source
 | ||
| 	}
 | ||
| 
 | ||
| 	fill := ""
 | ||
| 	if len2 >= size-len1 {
 | ||
| 		fill = padStr[0 : size-len1]
 | ||
| 	} else {
 | ||
| 		fill = strings.Repeat(padStr, size-len1)
 | ||
| 	}
 | ||
| 	return fill[0:size-len1] + source
 | ||
| }
 | ||
| 
 | ||
| // KebabCase 将字符串转为短横线隔开式(kebab-case)
 | ||
| func KebabCase(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	regex := regexp.MustCompile(`[\W|_]+`)
 | ||
| 	blankSpace := " "
 | ||
| 	match := regex.ReplaceAllString(s, blankSpace)
 | ||
| 	rs := strings.Split(match, blankSpace)
 | ||
| 
 | ||
| 	var res []string
 | ||
| 	for _, v := range rs {
 | ||
| 		splitWords := splitWordsToLower(v)
 | ||
| 		if len(splitWords) > 0 {
 | ||
| 			res = append(res, splitWords...)
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return strings.Join(res, "-")
 | ||
| }
 | ||
| 
 | ||
| // SnakeCase 将字符串转为蛇形命名(snake_case)
 | ||
| func SnakeCase(s string) string {
 | ||
| 	if len(s) == 0 {
 | ||
| 		return ""
 | ||
| 	}
 | ||
| 
 | ||
| 	regex := regexp.MustCompile(`[\W|_]+`)
 | ||
| 	blankSpace := " "
 | ||
| 	match := regex.ReplaceAllString(s, blankSpace)
 | ||
| 	rs := strings.Split(match, blankSpace)
 | ||
| 
 | ||
| 	var res []string
 | ||
| 	for _, v := range rs {
 | ||
| 		splitWords := splitWordsToLower(v)
 | ||
| 		if len(splitWords) > 0 {
 | ||
| 			res = append(res, splitWords...)
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return strings.Join(res, "_")
 | ||
| }
 | ||
| 
 | ||
| // Before 在字符首次出现的位置之前,在源字符串中创建子串
 | ||
| func Before(s, char string) string {
 | ||
| 	if s == "" || char == "" {
 | ||
| 		return s
 | ||
| 	}
 | ||
| 	i := strings.Index(s, char)
 | ||
| 	return s[0:i]
 | ||
| }
 | ||
| 
 | ||
| // BeforeLast 在字符最后出现的位置之前,在源字符串中创建子串
 | ||
| func BeforeLast(s, char string) string {
 | ||
| 	if s == "" || char == "" {
 | ||
| 		return s
 | ||
| 	}
 | ||
| 	i := strings.LastIndex(s, char)
 | ||
| 	return s[0:i]
 | ||
| }
 | ||
| 
 | ||
| // After 在字符首次出现的位置后,在源字符串中创建子串
 | ||
| func After(s, char string) string {
 | ||
| 	if s == "" || char == "" {
 | ||
| 		return s
 | ||
| 	}
 | ||
| 	i := strings.Index(s, char)
 | ||
| 	return s[i+len(char):]
 | ||
| }
 | ||
| 
 | ||
| // AfterLast 在字符最后出现的位置后,在源字符串中创建子串
 | ||
| func AfterLast(s, char string) string {
 | ||
| 	if s == "" || char == "" {
 | ||
| 		return s
 | ||
| 	}
 | ||
| 	i := strings.LastIndex(s, char)
 | ||
| 	return s[i+len(char):]
 | ||
| }
 | ||
| 
 | ||
| // IsString 检查值的数据类型是否为字符串
 | ||
| func IsString(v any) bool {
 | ||
| 	if v == nil {
 | ||
| 		return false
 | ||
| 	}
 | ||
| 	switch v.(type) {
 | ||
| 	case string:
 | ||
| 		return true
 | ||
| 	default:
 | ||
| 		return false
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| // ReverseStr 返回字符顺序与给定字符串相反的字符串
 | ||
| func ReverseStr(s string) string {
 | ||
| 	r := []rune(s)
 | ||
| 	for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
 | ||
| 		r[i], r[j] = r[j], r[i]
 | ||
| 	}
 | ||
| 	return string(r)
 | ||
| }
 | ||
| 
 | ||
| // Wrap 用另一个字符串包住一个字符串
 | ||
| func Wrap(str string, wrapWith string) string {
 | ||
| 	if str == "" || wrapWith == "" {
 | ||
| 		return str
 | ||
| 	}
 | ||
| 	var sb strings.Builder
 | ||
| 	sb.WriteString(wrapWith)
 | ||
| 	sb.WriteString(str)
 | ||
| 	sb.WriteString(wrapWith)
 | ||
| 
 | ||
| 	return sb.String()
 | ||
| }
 | ||
| 
 | ||
| // Unwrap 从另一个字符串中解开一个给定的字符串,将改变str值
 | ||
| func Unwrap(str string, wrapToken string) string {
 | ||
| 	if str == "" || wrapToken == "" {
 | ||
| 		return str
 | ||
| 	}
 | ||
| 
 | ||
| 	firstIndex := strings.Index(str, wrapToken)
 | ||
| 	lastIndex := strings.LastIndex(str, wrapToken)
 | ||
| 
 | ||
| 	if firstIndex == 0 && lastIndex > 0 && lastIndex <= len(str)-1 {
 | ||
| 		if len(wrapToken) <= lastIndex {
 | ||
| 			str = str[len(wrapToken):lastIndex]
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	return str
 | ||
| }
 | ||
| 
 | ||
| // RemoveHTML 去除字符串中的 html, js
 | ||
| func RemoveHTML(str string) string {
 | ||
| 	if len(str) > 0 {
 | ||
| 		// 删除脚本
 | ||
| 		reg := regexp.MustCompile(`([\r\n])[\s]+`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`<script[^>]*?>.*?</script>`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		// 删除HTML
 | ||
| 		reg = regexp.MustCompile(`<(.[^>]*)>`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`([\r\n])[\s]+`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`-->`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`<!--.*`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(quot|#34);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(amp|#38);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(lt|#60);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(gt|#62);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(nbsp|#160);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(iexcl|#161);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(cent|#162);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(pound|#163);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&(copy|#169);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 		reg = regexp.MustCompile(`&#(\d+);`)
 | ||
| 		str = reg.ReplaceAllString(str, "")
 | ||
| 
 | ||
| 		str = strings.ReplaceAll(str, "<", "")
 | ||
| 		str = strings.ReplaceAll(str, ">", "")
 | ||
| 		str = strings.ReplaceAll(str, "\n", "")
 | ||
| 		str = strings.ReplaceAll(str, " ", "")
 | ||
| 		str = strings.ReplaceAll(str, " ", "")
 | ||
| 
 | ||
| 		return str
 | ||
| 	}
 | ||
| 	return ""
 | ||
| }
 |