package lea import ( "fmt" "regexp" "crypto/md5" "crypto/rand" "encoding/base64" "encoding/hex" "io" "gopkg.in/mgo.v2/bson" "time" math_rand "math/rand" ) // 字符串 // md5 func Md5(s string) string { h := md5.New() h.Write([]byte(s)) return hex.EncodeToString(h.Sum(nil)) } // Guid func NewGuid() string { b := make([]byte, 48) if _, err := io.ReadFull(rand.Reader, b); err != nil { return "" } return Md5(base64.URLEncoding.EncodeToString(b)) } // 后面加个str生成之, 更有保障, 确保唯一 func NewGuidWith(str string) string { b := make([]byte, 48) if _, err := io.ReadFull(rand.Reader, b); err != nil { return "" } return Md5(base64.URLEncoding.EncodeToString([]byte(string(b) + str))) } // 以byte来截取 func SubstringByte(str string, start int) string { return substr(str, start, len(str)-start, false) } func Substring(str string, start int) string { return substr(str, start, len(str)-start, true) } func Substr(str string, start, length int) string { return substr(str, start, length, true) } func substr(str string, start, length int, isRune bool) string { rs := []rune(str) rs2 := []byte(str) rl := len(rs) if !isRune { rl = len(rs2) } end := 0 if start < 0 { start = rl - 1 + start } end = start + length if start > end { start, end = end, start } if start < 0 { start = 0 } if start > rl { start = rl } if end < 0 { end = 0 } if end > rl { end = rl } if isRune { return string(rs[start:end]) } return string(rs2[start:end]) } // 截取含html的字符串 /*
abcdef

xxxxxxxxxxx

abcdfef

aksdfjsld dfsadf --------------- 这里截断

xxxxxxxxxxxxxxx

abcdef
那么只要在最后的html中添加

补全结束即可 思路: 1. 找到截断的位置 2. 去掉成对的标签 3. 去掉不要结束的标签 4. 补全标签 */ func ReplaceAll(oldStr, pattern, newStr string) string { p, _ := regexp.Compile(pattern) s := p.ReplaceAll([]byte(oldStr), []byte(newStr)) return string(s) } func SubStringHTML(param string, length int, end string) string { // 先取出
占位..
	
	result := ""

	// 1
	n := 0
	var temp rune // 中文问题, 用rune来解决
	isCode := false //是不是HTML代码
	isHTML := false //是不是HTML特殊字符,如 
	rStr := []rune(param)
	for i := 0; i < len(rStr); i++ {
		temp = rStr[i]
		if temp == '<' {
			isCode = true
		} else if temp == '&' {
			isHTML = true
		} else if temp == '>' && isCode {
			n = n - 1
			isCode = false
		} else if temp == ';' && isHTML {
			isHTML = false
		}
		if !isCode && !isHTML {
			n = n + 1
		}
		result += string(temp)
		if n >= length {
			break
		}
	}
	result += end
	
	// 取出所有标签
	tempResult := ReplaceAll(result, "(>)[^<>]*(]*/?>", "")

	// 把
]*>", "<$1>") // 3 只能用正则,+stack来去有结束的 // golang的正则暂不支持back reference, 以后可以用它来去掉重复的标签 p, _ := regexp.Compile("<(/?[a-zA-Z]+)[^<>]*>") // 得到所有的
,
... strs := p.FindAllString(tempResult, -1) // fmt.Println(strs) stack := make([]string, len(strs)) stackP := -1 for _, each := range strs { if stackP >= 0 { // 匹配 if stack[stackP][1:] == each[2:] { stackP-- continue } } stackP++ stack[stackP] = each } // 补全tag if stackP != -1 { fmt.Println(stack[0 : stackP+1]) for _, each := range stack[0 : stackP+1] { if each[1] != '/' { result += "