*/ public static function parseList(string $raw): array { $raw = trim($raw); if ($raw === '') { return []; } $parts = preg_split('/[\r\n,]+/', $raw) ?: []; $domains = []; foreach ($parts as $part) { $domain = DomainModel::normalizeDomain(trim((string) $part)); if ($domain === '' || isset($domains[$domain])) { continue; } if (!DomainModel::isValidRootDomain($domain)) { continue; } $domains[$domain] = $domain; } return array_values($domains); } /** * 将域名列表格式化为配置存储文本(一行一个) * * @param array $domains */ public static function formatList(array $domains): string { $lines = []; foreach ($domains as $domain) { $domain = DomainModel::normalizeDomain((string) $domain); if ($domain !== '' && DomainModel::isValidRootDomain($domain)) { $lines[$domain] = $domain; } } return implode("\n", array_values($lines)); } }