1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package desktop
- import (
- "encoding/json"
- "regexp"
- "strings"
- )
- type MatchResult struct {
- Params map[string]string `json:"params"`
- Match bool `json:"match"`
- Origin string `json:"origin"`
- Pattern string `json:"pattern"`
- }
- func (r *MatchResult) String() string {
- b, err := json.Marshal(r)
- if err != nil {
- return ""
- }
- return string(b)
- }
- func (r *MatchResult) GetParam(key string) string {
- return r.Params[key]
- }
- func ParseKey(pattern string) string {
- index := strings.Index(pattern, "/:")
- if index < 0 || index > len(pattern)-2 {
- return ""
- }
- str := pattern[index+1:]
- end := strings.Index(str, "/")
- if end == -1 {
- end = len(str)
- }
- key := str[0:end]
- return key
- }
- // ParsePathParam 解析路径中的 :id 字段
- func ParsePathParam(path string, pattern string) *MatchResult {
- var result = &MatchResult{
- Match: false,
- Params: map[string]string{},
- Origin: path,
- }
- var keys []string
- var reg = pattern
- for i := 0; true; i++ {
- key := ParseKey(reg)
- if len(key) == 0 {
- break
- }
- keys = append(keys, key[1:])
- reg = strings.ReplaceAll(reg, key, "(.+)?")
- }
- result.Pattern = reg
- compile := regexp.MustCompile(reg)
- match := compile.FindStringSubmatch(path)
- if len(match) < 1 {
- return result
- }
- result.Match = true
- for i := 1; i < len(match); i++ {
- k := keys[i-1]
- result.Params[k] = match[i]
- }
- return result
- }
|