fix(scope): 含点号的文本不再被误判为 ICP 备案号

单文本框自动分类只要文本里出现 "icp" 或 "备案" 子串就判定为 ICP 规则。
备案号本身不含点号(京ICP备12345678号-1),而 ICP 归属走的是精确相等比较
(companies.go 的 kind='icp' 归属查询),所以掺了域名或版本号的描述性文字
一旦被判成 ICP,就会存成一条永远匹配不上任何资产的死规则,且无任何提示。

分类条件增加"不含点号",半角 . 之外一并覆盖全角 .和中文句号 。——粘贴
中文内容时容易出现这两个,真实备案号里同样不会有。

已有的 "京 ICP备 123号"、"沪网备案 9988" 仍判定为 ICP,不受影响。

Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy
This commit is contained in:
Autumn-27 committed 2026-08-22 06:26:07 -04:00
1 parent 9b75afe9f1
commit fbddf1cfb5
2 files changed
+10 -1

No files matched your search

+5 -1
View File
@@ -152,8 +152,12 @@ func ParseAutoScopeLine(line string) (ParsedScope, error) {
if looksLikeDomain {
return ParseScopeLine(raw)
}
// 备案号本身不含点号(如 京ICP备12345678号-1)。带点的文本多半掺了域名或版本号,
// 按 ICP 存下来只会得到一条永远匹配不上任何资产的死规则 —— ICP 归属走的是精确
// 相等比较(见 companies.go 的 kind='icp' 归属查询),所以这类文本归为关键词。
lower := strings.ToLower(raw)
if strings.Contains(lower, "icp") || strings.Contains(raw, "备案") {
if !strings.ContainsAny(raw, "..。") &&
(strings.Contains(lower, "icp") || strings.Contains(raw, "备案")) {
return ParseScopeInput(ScopeInput{Kind: "icp", Value: raw})
}
return ParseScopeInput(ScopeInput{Kind: "keyword", Value: raw})
+5
View File
@@ -60,6 +60,11 @@ func TestParseAutoScopeLine(t *testing.T) {
{name: "icp chinese", input: "沪网备案 9988", kind: "icp", normalized: "沪网备案9988"},
{name: "icp domain", input: "icp.example.com", kind: "domain", normalized: "icp.example.com"},
{name: "icp url query", input: "https://example.com/path?icp=1", kind: "domain", normalized: "example.com"},
// 备案号不含点号:掺了域名/版本号的描述性文字归关键词,否则会存成一条
// 永远匹配不上的死 ICP 规则。
{name: "icp with domain text", input: "备案 www.example.com", kind: "keyword", normalized: "备案 www.example.com"},
{name: "icp with version text", input: "某公司 ICP v1.0", kind: "keyword", normalized: "某公司 icp v1.0"},
{name: "icp fullwidth dot", input: "备案 例.com", kind: "keyword", normalized: "备案 例.com"},
{name: "keyword", input: " ACME Security ", kind: "keyword", normalized: "acme security"},
{name: "colon keyword", input: "ACME: Cloud: Security", kind: "keyword", normalized: "acme: cloud: security"},
{name: "empty", input: " ", wantErr: true},