diff --git a/constant/rule.go b/constant/rule.go index 66fc18bb7..9b0382219 100644 --- a/constant/rule.go +++ b/constant/rule.go @@ -5,6 +5,7 @@ const ( Domain RuleType = iota DomainSuffix DomainKeyword + DomainRegex GEOSITE GEOIP IPCIDR @@ -40,6 +41,8 @@ func (rt RuleType) String() string { return "DomainSuffix" case DomainKeyword: return "DomainKeyword" + case DomainRegex: + return "DomainRegex" case GEOSITE: return "GeoSite" case GEOIP: diff --git a/rules/common/domain_regex.go b/rules/common/domain_regex.go new file mode 100644 index 000000000..f1eb87e6e --- /dev/null +++ b/rules/common/domain_regex.go @@ -0,0 +1,42 @@ +package common + +import ( + "regexp" + "strings" + + C "github.com/metacubex/mihomo/constant" +) + +type DomainRegex struct { + *Base + regex string + adapter string +} + +func (dr *DomainRegex) RuleType() C.RuleType { + return C.DomainRegex +} + +func (dr *DomainRegex) Match(metadata *C.Metadata) (bool, string) { + domain := metadata.RuleHost() + match, _ := regexp.MatchString(dr.regex, domain) + return match, dr.adapter +} + +func (dr *DomainRegex) Adapter() string { + return dr.adapter +} + +func (dr *DomainRegex) Payload() string { + return dr.regex +} + +func NewDomainRegex(regex string, adapter string) *DomainRegex { + return &DomainRegex{ + Base: &Base{}, + regex: strings.ToLower(regex), + adapter: adapter, + } +} + +//var _ C.Rule = (*DomainRegex)(nil) diff --git a/rules/parser.go b/rules/parser.go index 7a79b18bf..23f781230 100644 --- a/rules/parser.go +++ b/rules/parser.go @@ -2,7 +2,7 @@ package rules import ( "fmt" - + C "github.com/metacubex/mihomo/constant" RC "github.com/metacubex/mihomo/rules/common" "github.com/metacubex/mihomo/rules/logic" @@ -17,6 +17,8 @@ func ParseRule(tp, payload, target string, params []string, subRules map[string] parsed = RC.NewDomainSuffix(payload, target) case "DOMAIN-KEYWORD": parsed = RC.NewDomainKeyword(payload, target) + case "DOMAIN-REGEX": + parsed = RC.NewDomainRegex(payload, target) case "GEOSITE": parsed, parseErr = RC.NewGEOSITE(payload, target) case "GEOIP":