From 3c8886c97fa7be65718f8d780ea86202f2c71a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sun, 28 Jun 2026 14:33:11 +0300 Subject: [PATCH] =?UTF-8?q?feat(=D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B1=D0=BE=D1=80):=20stripBadge=20=E2=80=94=20=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B5=20=D0=B8=D0=BC=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D0=BA=D1=83=D1=80=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=B7=D0=BD=D0=B0=D1=87=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Autopodbor/AutopodborNormalizer.php | 16 ++++++++++ .../AutopodborNormalizerStripBadgeTest.php | 30 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 app/tests/Unit/Autopodbor/AutopodborNormalizerStripBadgeTest.php 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'); +});