261 lines
5.8 KiB
Go
261 lines
5.8 KiB
Go
|
// stringutil 包含有用于处理字符串的工具函数。
|
|||
|
package tools
|
|||
|
|
|||
|
import (
|
|||
|
"crypto/rand"
|
|||
|
"fmt"
|
|||
|
"github.com/gobuffalo/packr/v2"
|
|||
|
"net"
|
|||
|
"regexp"
|
|||
|
"strconv"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
// Reverse 将其实参字符串以符文为单位左右反转。
|
|||
|
func Reverse(s string) string {
|
|||
|
r := []rune(s)
|
|||
|
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
|
|||
|
r[i], r[j] = r[j], r[i]
|
|||
|
}
|
|||
|
return string(r)
|
|||
|
}
|
|||
|
|
|||
|
// Reverse2 将其实参字符串以符文为单位左右反转。
|
|||
|
func Reverse2(s string) string {
|
|||
|
r := []rune(s)
|
|||
|
left := 0
|
|||
|
right := len(r) - 1
|
|||
|
for left < right {
|
|||
|
r[left], r[right] = r[right], r[left]
|
|||
|
left++
|
|||
|
right--
|
|||
|
}
|
|||
|
return string(r)
|
|||
|
}
|
|||
|
|
|||
|
// 获取文件内容,可以打包到二进制
|
|||
|
func FileGetContent(file string) string {
|
|||
|
str := ""
|
|||
|
box := packr.New("tmpl", "../static")
|
|||
|
content, err := box.FindString(file)
|
|||
|
if err != nil {
|
|||
|
return str
|
|||
|
}
|
|||
|
return content
|
|||
|
}
|
|||
|
|
|||
|
func ShowStringByte(str string) {
|
|||
|
s := []byte(str)
|
|||
|
for i, c := range s {
|
|||
|
fmt.Println(i, c)
|
|||
|
}
|
|||
|
}
|
|||
|
func NilChannel() {
|
|||
|
var ch chan int
|
|||
|
ch <- 1
|
|||
|
}
|
|||
|
|
|||
|
// 截取字符串,支持多字节字符
|
|||
|
// start:起始下标,负数从从尾部开始,最后一个为-1
|
|||
|
// length:截取长度,负数表示截取到末尾
|
|||
|
func SubStr(str string, start int, length int) (result string) {
|
|||
|
s := []rune(str)
|
|||
|
total := len(s)
|
|||
|
if total == 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
// 允许从尾部开始计算
|
|||
|
if start < 0 {
|
|||
|
start = total + start
|
|||
|
if start < 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if start > total {
|
|||
|
return
|
|||
|
}
|
|||
|
// 到末尾
|
|||
|
if length < 0 {
|
|||
|
length = total
|
|||
|
}
|
|||
|
|
|||
|
end := start + length
|
|||
|
if end > total {
|
|||
|
result = string(s[start:])
|
|||
|
} else {
|
|||
|
result = string(s[start:end])
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 替换字符串中特定位置的字符
|
|||
|
//
|
|||
|
// str2 := []rune("21")
|
|||
|
// str3 := ReplaceAtPosition(string(str2), len(str2), "3")
|
|||
|
// log.Println(str3)//替换最后一位
|
|||
|
func ReplaceAtPosition(originaltext string, indexofcharacter int, replacement string) string {
|
|||
|
if originaltext == "" {
|
|||
|
for i := 1; i <= indexofcharacter; i++ {
|
|||
|
originaltext += "0"
|
|||
|
}
|
|||
|
}
|
|||
|
runes := []rune(originaltext)
|
|||
|
partOne := string(runes[0 : indexofcharacter-1])
|
|||
|
partTwo := string(runes[indexofcharacter:len(runes)])
|
|||
|
return partOne + replacement + partTwo
|
|||
|
}
|
|||
|
func Str2Int(str string) int {
|
|||
|
res := 0
|
|||
|
var err error
|
|||
|
if res, err = strconv.Atoi(str); err != nil {
|
|||
|
return 0
|
|||
|
}
|
|||
|
return res
|
|||
|
}
|
|||
|
func Str2Int64(str string) int64 {
|
|||
|
var res int64
|
|||
|
var err error
|
|||
|
if res, err = strconv.ParseInt(str, 10, 64); err != nil {
|
|||
|
return 0
|
|||
|
}
|
|||
|
return res
|
|||
|
}
|
|||
|
func Str2Float64(str string) float64 {
|
|||
|
var res float64
|
|||
|
var err error
|
|||
|
if res, err = strconv.ParseFloat(str, 64); err != nil {
|
|||
|
return res
|
|||
|
}
|
|||
|
return res
|
|||
|
}
|
|||
|
func Str2Uint(str string) uint {
|
|||
|
res := Str2Int(str)
|
|||
|
return uint(res)
|
|||
|
}
|
|||
|
func Int2Str(i interface{}) string {
|
|||
|
return fmt.Sprintf("%v", i)
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
*
|
|||
|
去除html标签,过滤html标签
|
|||
|
*/
|
|||
|
func TrimHtml(src string) string {
|
|||
|
//将HTML标签全转换成小写
|
|||
|
re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
|
|||
|
src = re.ReplaceAllStringFunc(src, strings.ToLower)
|
|||
|
//去除STYLE
|
|||
|
re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
|
|||
|
src = re.ReplaceAllString(src, "")
|
|||
|
//去除SCRIPT
|
|||
|
re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
|
|||
|
src = re.ReplaceAllString(src, "")
|
|||
|
//去除所有尖括号内的HTML代码,并换成换行符
|
|||
|
re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
|
|||
|
src = re.ReplaceAllString(src, "\n")
|
|||
|
//去除连续的换行符
|
|||
|
re, _ = regexp.Compile("\\s{2,}")
|
|||
|
src = re.ReplaceAllString(src, "\n")
|
|||
|
return strings.TrimSpace(src)
|
|||
|
}
|
|||
|
|
|||
|
// 三元运算
|
|||
|
func Ifelse(condition bool, trueValue, falseValue interface{}) interface{} {
|
|||
|
if condition {
|
|||
|
return trueValue
|
|||
|
} else {
|
|||
|
return falseValue
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 判断是不是IP
|
|||
|
func IsIP(str string) bool {
|
|||
|
ip := net.ParseIP(str)
|
|||
|
return ip != nil
|
|||
|
}
|
|||
|
|
|||
|
// 判断是否手机
|
|||
|
func IsPhoneNumber(str string) bool {
|
|||
|
reg := `^1[3456789]\d{9}$`
|
|||
|
r := regexp.MustCompile(reg)
|
|||
|
return r.MatchString(str)
|
|||
|
}
|
|||
|
|
|||
|
// 判断是否邮箱
|
|||
|
func IsEmail(str string) bool {
|
|||
|
// 定义邮箱正则表达式
|
|||
|
emailRegexp := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
|
|||
|
// 编译正则表达式
|
|||
|
r := regexp.MustCompile(emailRegexp)
|
|||
|
// 匹配字符串
|
|||
|
return r.MatchString(str)
|
|||
|
}
|
|||
|
|
|||
|
// 是否匹配域名
|
|||
|
func IsMatchingDomain(allowedDomain, domainToCheck string) bool {
|
|||
|
// 将通配符域名中的 * 替换为正则表达式可以匹配的模式
|
|||
|
allowedDomain = strings.ReplaceAll(allowedDomain, "*", ".*")
|
|||
|
|
|||
|
// 使用正则表达式匹配
|
|||
|
matched, err := regexp.MatchString("^"+allowedDomain+"$", domainToCheck)
|
|||
|
if err != nil {
|
|||
|
return false
|
|||
|
}
|
|||
|
return matched
|
|||
|
}
|
|||
|
|
|||
|
// 强密码验证,必须包含大写字母,小写字母,数字和特殊字符,并且不能少于8位
|
|||
|
func IsStrongPass(pass string) bool {
|
|||
|
// 编写多个子正则表达式来检查密码的不同方面
|
|||
|
var regexps = []*regexp.Regexp{
|
|||
|
regexp.MustCompile(`[a-z]`), // 小写字母
|
|||
|
regexp.MustCompile(`[A-Z]`), // 大写字母
|
|||
|
regexp.MustCompile(`[0-9]`), // 数字
|
|||
|
regexp.MustCompile(`[^a-zA-Z0-9]`), // 非字母和非数字字符
|
|||
|
}
|
|||
|
|
|||
|
for _, re := range regexps {
|
|||
|
idx := re.FindStringIndex(pass)
|
|||
|
if idx == nil {
|
|||
|
return false // 如果某个条件不满足,返回 false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 检查密码长度是否大于等于8
|
|||
|
if len(pass) < 8 {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
return true // 所有条件都满足,返回 true
|
|||
|
}
|
|||
|
|
|||
|
// 判断字符串是否位于字符串数组
|
|||
|
func IsInArray(str string, arr []string) bool {
|
|||
|
for _, v := range arr {
|
|||
|
if str == v {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
// 生成随机字符
|
|||
|
func randomChar() rune {
|
|||
|
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|||
|
length := len(charset)
|
|||
|
b := make([]byte, 1)
|
|||
|
rand.Read(b)
|
|||
|
return rune(charset[int(b[0])%length])
|
|||
|
}
|
|||
|
|
|||
|
// 生成随机字符串
|
|||
|
func GenerateRandomString(n int) string {
|
|||
|
var sb strings.Builder
|
|||
|
sb.Grow(n) // 预分配内存
|
|||
|
for i := 0; i < n; i++ {
|
|||
|
sb.WriteRune(randomChar())
|
|||
|
}
|
|||
|
return sb.String()
|
|||
|
}
|