kefu/tools/stringutil.go

261 lines
5.8 KiB
Go
Raw Permalink Normal View History

2024-12-10 02:50:12 +00:00
// 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()
}