mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
						|
 | 
						|
package iplibrary
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/iwind/TeaGo/lists"
 | 
						|
	"regexp"
 | 
						|
)
 | 
						|
 | 
						|
type Template struct {
 | 
						|
	templateString string
 | 
						|
	reg            *regexp.Regexp
 | 
						|
}
 | 
						|
 | 
						|
func NewTemplate(templateString string) (*Template, error) {
 | 
						|
	var t = &Template{
 | 
						|
		templateString: templateString,
 | 
						|
	}
 | 
						|
	err := t.init()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return t, nil
 | 
						|
}
 | 
						|
 | 
						|
func (this *Template) init() error {
 | 
						|
	var template = regexp.QuoteMeta(this.templateString)
 | 
						|
	var keywordReg = regexp.MustCompile(`\\\$\\{(\w+)\\}`)
 | 
						|
	template = keywordReg.ReplaceAllStringFunc(template, func(keyword string) string {
 | 
						|
		var matches = keywordReg.FindStringSubmatch(keyword)
 | 
						|
		if len(matches) > 1 {
 | 
						|
			switch matches[1] {
 | 
						|
			case "ipFrom", "ipTo", "country", "province", "city", "town", "provider":
 | 
						|
				return "(?P<" + matches[1] + ">.*)"
 | 
						|
			}
 | 
						|
			return ".*"
 | 
						|
		}
 | 
						|
 | 
						|
		return keyword
 | 
						|
	})
 | 
						|
	reg, err := regexp.Compile("^(?U)" + template + "\n?$")
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	this.reg = reg
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (this *Template) Extract(text string, emptyValues []string) (values map[string]string, ok bool) {
 | 
						|
	var matches = this.reg.FindStringSubmatch(text)
 | 
						|
	if len(matches) == 0 {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	values = map[string]string{}
 | 
						|
	for index, name := range this.reg.SubexpNames() {
 | 
						|
		if len(name) == 0 {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		var v = matches[index]
 | 
						|
		if name != "ipFrom" && name != "ipTo" && (v == "0" || v == "无" || v == "空" || lists.ContainsString(emptyValues, v)) {
 | 
						|
			v = ""
 | 
						|
		}
 | 
						|
		values[name] = v
 | 
						|
	}
 | 
						|
 | 
						|
	for _, keyword := range []string{"ipFrom", "ipTo", "country", "province", "city", "town", "provider"} {
 | 
						|
		_, hasKeyword := values[keyword]
 | 
						|
		if !hasKeyword {
 | 
						|
			values[keyword] = ""
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// 自动修复省略的城市名
 | 
						|
	if len(values["city"]) == 0 && len(values["province"]) > 0 && len(values["town"]) > 0 {
 | 
						|
		values["city"] = values["province"]
 | 
						|
	}
 | 
						|
 | 
						|
	ok = true
 | 
						|
	return
 | 
						|
}
 |