46 lines
928 B
Go
46 lines
928 B
Go
package utils
|
|
|
|
import "strings"
|
|
|
|
func ParseRules(rulesRaw []string) [][]string {
|
|
var rules [][]string
|
|
for _, r := range rulesRaw {
|
|
if r == "" {
|
|
continue
|
|
}
|
|
if !strings.HasSuffix(r, ".") {
|
|
r += "."
|
|
}
|
|
rules = append(rules, strings.Split(r, "."))
|
|
}
|
|
return rules
|
|
}
|
|
|
|
func HasMatchedRule(rules [][]string, domain string) bool {
|
|
var hasMatch bool
|
|
OUTER:
|
|
for _, m := range rules {
|
|
domainSplited := strings.Split(domain, ".")
|
|
i := len(m) - 1
|
|
j := len(domainSplited) - 1
|
|
// 从根域名开始匹配
|
|
for i >= 0 && j >= 0 {
|
|
if m[i] != domainSplited[j] && m[i] != "" {
|
|
continue OUTER
|
|
}
|
|
i--
|
|
j--
|
|
}
|
|
// 如果规则中还有剩余,但是域名已经匹配完了,检查规则最后一位是否是任意匹配
|
|
if j != -1 && i == -1 && m[0] != "" {
|
|
continue OUTER
|
|
}
|
|
hasMatch = i == -1
|
|
// 如果匹配到了,就不用再匹配了
|
|
if hasMatch {
|
|
break
|
|
}
|
|
}
|
|
return hasMatch
|
|
}
|