"\']+|\b[a-z0-9-]+(?:\.[a-z0-9-]+)*\.[a-z]{2,}/[^\s,;|()<>"\']*~iu'; /** * @return array{name: string, website: ?string, removed: list} */ public static function normalize(string $name, ?string $website = null): array { $removed = []; $stripped = (string) preg_replace_callback(self::URL_PATTERN, static function (array $match) use (&$removed): string { $removed[] = rtrim($match[0], '.,:;'); return ' '; }, $name); $clean = self::tidy($stripped); if ($clean === '' && $removed !== []) { $clean = self::host($removed[0]) ?? Str::squish($name); } if (blank($website) && $removed !== []) { $website = $removed[0]; } return [ 'name' => $clean !== '' ? $clean : Str::squish($name), 'website' => filled($website) ? trim((string) $website) : null, 'removed' => $removed, ]; } public static function containsUrl(string $name): bool { return preg_match(self::URL_PATTERN, $name) === 1; } /** * Verwaiste Trenner nach dem Herausziehen der URL aufräumen: * „Firma - “, „ - Firma", „Firma ( )", „Firma /". */ private static function tidy(string $value): string { $value = (string) preg_replace('~\(\s*\)|\[\s*\]~u', ' ', $value); $value = Str::squish($value); $value = (string) preg_replace('~(?:\s*[-–—|/,:]+\s*){2,}~u', ' - ', $value); return trim($value, " \t\n\r\0\x0B-–—|/,:"); } private static function host(string $url): ?string { $candidate = Str::startsWith(mb_strtolower($url), ['http://', 'https://']) ? $url : 'https://'.$url; $host = parse_url($candidate, PHP_URL_HOST); if (! is_string($host) || $host === '') { return null; } return (string) preg_replace('~^www\.~i', '', mb_strtolower($host)); } }