Files
cmautobuy/admin/spec/shopee_spec.go
T

57 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package spec
import "strings"
// ParsedShopeeSpec 是从顺运宝规格原文中确定性得到的蝦皮规格字段。
// 解析器只接受“颜色,尺码”这种明确的二维格式,不做语义猜测。
type ParsedShopeeSpec struct {
Color string
Size string
Advice string
}
// ParseShopeeSpec 解析顺运宝常见的“颜色,尺码【建议范围】”格式。
// 返回 false 表示格式不明确,调用方应保留原文且不得写入结构化字段。
func ParseShopeeSpec(raw string) (ParsedShopeeSpec, bool) {
normalized := strings.ReplaceAll(strings.TrimSpace(raw), ",", ",")
if strings.Count(normalized, ",") != 1 {
return ParsedShopeeSpec{}, false
}
parts := strings.SplitN(normalized, ",", 2)
color, sizePart := strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1])
if color == "" || sizePart == "" {
return ParsedShopeeSpec{}, false
}
size, advice := sizePart, ""
if bracket := strings.Index(sizePart, "【"); bracket >= 0 {
if !strings.HasSuffix(sizePart, "】") || strings.Count(sizePart, "【") != 1 || strings.Count(sizePart, "】") != 1 {
return ParsedShopeeSpec{}, false
}
size = strings.TrimSpace(sizePart[:bracket])
advice = strings.TrimSpace(strings.TrimSuffix(sizePart[bracket+len("【"):], "】"))
for _, prefix := range []string{"建议", "建議", "推荐", "推薦"} {
advice = strings.TrimSpace(strings.TrimPrefix(advice, prefix))
}
if advice == "" {
return ParsedShopeeSpec{}, false
}
}
size = strings.ToUpper(strings.TrimSpace(size))
if !isRecognizedSize(size) {
return ParsedShopeeSpec{}, false
}
return ParsedShopeeSpec{Color: color, Size: size, Advice: advice}, true
}
func isRecognizedSize(size string) bool {
switch size {
case "XXXS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "XXXL",
"2XL", "3XL", "4XL", "5XL", "6XL", "7XL", "8XL", "9XL",
"F", "FREE", "均码", "均碼":
return true
default:
return false
}
}