diff --git a/app/app/Services/Autopodbor/AutopodborNormalizer.php b/app/app/Services/Autopodbor/AutopodborNormalizer.php index e5c761cd..7d9cb9e4 100644 --- a/app/app/Services/Autopodbor/AutopodborNormalizer.php +++ b/app/app/Services/Autopodbor/AutopodborNormalizer.php @@ -71,6 +71,22 @@ final class AutopodborNormalizer return $type . ':' . $id; } + /** + * Срезает хвостовой значок (✓ или 🎭) вместе с пробелами перед ним. + * Если значка нет — строка возвращается без изменений. + * Примеры: + * 'Окна Комфорт ✓' → 'Окна Комфорт' + * 'Окна Комфорт 🎭' → 'Окна Комфорт' + * 'Окна Комфорт' → 'Окна Комфорт' + * 'Балкон-Сервис 16' → 'Балкон-Сервис 16' + */ + public function stripBadge(string $name): string + { + // Срезаем ровно один хвостовой значок (✓ или 🎭) вместе с пробелами перед ним. + // Используем mb-безопасный regex с флагом u (эмодзи 🎭 — 4-байтный). + return preg_replace('/\s*(?:\x{2713}|\x{1F3AD})\s*$/u', '', $name) ?? $name; + } + /** * Строит dedup-ключ для конкурента. * Если есть сайт — «site:домен», иначе «name:имя_в_нижнем_регистре». diff --git a/app/tests/Unit/Autopodbor/AutopodborNormalizerStripBadgeTest.php b/app/tests/Unit/Autopodbor/AutopodborNormalizerStripBadgeTest.php new file mode 100644 index 00000000..ae818c01 --- /dev/null +++ b/app/tests/Unit/Autopodbor/AutopodborNormalizerStripBadgeTest.php @@ -0,0 +1,30 @@ +stripBadge('Окна Комфорт ✓'))->toBe('Окна Комфорт'); +}); + +it('срезает значок подменного номера', function () { + $n = new AutopodborNormalizer(); + expect($n->stripBadge('Окна Комфорт 🎭'))->toBe('Окна Комфорт'); +}); + +it('имя без значка не меняется', function () { + $n = new AutopodborNormalizer(); + expect($n->stripBadge('Окна Комфорт'))->toBe('Окна Комфорт'); +}); + +it('имя сайта (без значка) с внутренними пробелами сохраняется', function () { + $n = new AutopodborNormalizer(); + expect($n->stripBadge('Балкон-Сервис 16'))->toBe('Балкон-Сервис 16'); +}); + +it('числовой суффикс не трогается (значка нет)', function () { + $n = new AutopodborNormalizer(); + expect($n->stripBadge('Окна Комфорт 2'))->toBe('Окна Комфорт 2'); +});