update regex to dynamically include all supported prefixes for improved proxy parsing.

This commit is contained in:
2025-06-12 13:40:30 +10:00
parent 8b3ae45623
commit 8db2c46bf0
2 changed files with 17 additions and 12 deletions

View File

@ -148,7 +148,11 @@ func BuildSub(clashType model.ClashType, query model.SubConfig, template string,
err = yaml.Unmarshal(data, &sub)
var newProxies []P.Proxy
if err != nil {
reg, _ := regexp.Compile("(ssr|ss|vmess|trojan|vless|hysteria|hy2|hysteria2|socks)://")
reg, err := regexp.Compile("(" + strings.Join(parser.GetAllPrefixes(), "|") + ")://")
if err != nil {
logger.Logger.Debug("compile regex failed", zap.Error(err))
return nil, NewRegexInvalidError("prefix", err)
}
if reg.Match(data) {
p := parser.ParseProxies(strings.Split(string(data), "\n")...)
newProxies = p

View File

@ -7,29 +7,23 @@ import (
P "github.com/bestnite/sub2clash/model/proxy"
)
// ProxyParser 定义代理解析器接口
type ProxyParser interface {
// Parse 解析代理字符串并返回Proxy对象
Parse(proxy string) (P.Proxy, error)
// GetPrefix 返回支持的协议前缀(可以返回多个)
GetPrefixes() []string
// GetType 返回协议类型名称
GetType() string
SupportClash() bool
SupportMeta() bool
}
// parserRegistry 解析器注册中心
type parserRegistry struct {
mu sync.RWMutex
parsers map[string]ProxyParser // prefix -> parser
parsers map[string]ProxyParser
}
var registry = &parserRegistry{
parsers: make(map[string]ProxyParser),
}
// RegisterParser 注册解析器
func RegisterParser(parser ProxyParser) {
registry.mu.Lock()
defer registry.mu.Unlock()
@ -39,7 +33,6 @@ func RegisterParser(parser ProxyParser) {
}
}
// GetParser 根据前缀获取解析器
func GetParser(prefix string) (ProxyParser, bool) {
registry.mu.RLock()
defer registry.mu.RUnlock()
@ -48,7 +41,6 @@ func GetParser(prefix string) (ProxyParser, bool) {
return parser, exists
}
// GetAllParsers 获取所有注册的解析器
func GetAllParsers() map[string]ProxyParser {
registry.mu.RLock()
defer registry.mu.RUnlock()
@ -60,14 +52,23 @@ func GetAllParsers() map[string]ProxyParser {
return result
}
// ParseProxyWithRegistry 使用注册机制解析代理
func GetAllPrefixes() []string {
registry.mu.RLock()
defer registry.mu.RUnlock()
prefixes := make([]string, 0, len(registry.parsers))
for prefix := range registry.parsers {
prefixes = append(prefixes, prefix)
}
return prefixes
}
func ParseProxyWithRegistry(proxy string) (P.Proxy, error) {
proxy = strings.TrimSpace(proxy)
if proxy == "" {
return P.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: "empty proxy string"}
}
// 查找匹配的解析器
for prefix, parser := range registry.parsers {
if strings.HasPrefix(proxy, prefix) {
return parser.Parse(proxy)