diff --git a/adapter/provider/parser.go b/adapter/provider/parser.go index 0c606a9521..4e168f7a58 100644 --- a/adapter/provider/parser.go +++ b/adapter/provider/parser.go @@ -26,6 +26,13 @@ type healthCheckSchema struct { ExpectedStatus string `provider:"expected-status,omitempty"` } +type OverrideProxyNameSchema struct { + // matching expression for regex replacement + Pattern string `provider:"pattern"` + // the new content after regex matching + Target string `provider:"target"` +} + type OverrideSchema struct { TFO *bool `provider:"tfo,omitempty"` MPTcp *bool `provider:"mptcp,omitempty"` @@ -40,6 +47,8 @@ type OverrideSchema struct { IPVersion *string `provider:"ip-version,omitempty"` AdditionalPrefix *string `provider:"additional-prefix,omitempty"` AdditionalSuffix *string `provider:"additional-suffix,omitempty"` + + ProxyName []OverrideProxyNameSchema `provider:"proxy-name,omitempty"` } type proxyProviderSchema struct { diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 5f86777cc4..789d665467 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -403,6 +403,24 @@ func proxiesParseAndFilter(filter string, excludeFilter string, excludeTypeArray case "additional-suffix": name := mapping["name"].(string) mapping["name"] = name + *field.Interface().(*string) + case "proxy-name": + exprList, ok := field.Interface().([]OverrideProxyNameSchema) + if !ok { + return nil, fmt.Errorf("can't parse proxy-provider override proxy-name, please see the docs example config") + } + // Iterate through all naming replacement rules and perform the replacements. + for _, expr := range exprList { + name := mapping["name"].(string) + nameReg, err := regexp2.Compile(expr.Pattern, regexp2.None) + if err != nil { + return nil, fmt.Errorf("parse proxy name regular expression %q error: %w", expr.Pattern, err) + } + newName, err := nameReg.Replace(name, expr.Target, 0, -1) + if err != nil { + return nil, fmt.Errorf("proxy name replace error: %w", err) + } + mapping["name"] = newName + } default: mapping[fieldName] = field.Elem().Interface() } diff --git a/docs/config.yaml b/docs/config.yaml index 78e62d1280..f7b573ebd4 100644 --- a/docs/config.yaml +++ b/docs/config.yaml @@ -929,6 +929,13 @@ proxy-providers: # ip-version: ipv4-prefer # additional-prefix: "[provider1]" # additional-suffix: "test" + # # 名字替换,支持正则表达式 + # proxy-name: + # - pattern: "test" + # target: "TEST" + # - pattern: "IPLC-(.*?)倍" + # target: "iplc x $1" + test: type: file path: /test.yaml