PHP код, который очищает название товара типа текст от HTML Тегов

К примеру мы хотим куда-то, для каких-то целей строкой выводить название товара, товаров. Стандартно Битрикс24 выводит название из поля типо текст с HTML тегами </b> и так далее. Давайте напишем код, который будет очищать название от лишних символов и выводить в переменную Variable2 чистое название.


// 1. Получаем данные из Variable1
$input = $this->GetVariable('Variable1');
if ($input === null) {
    $input = '';
}

// 2. Создаем лог
$log = "=== Лог обработки товара ===\n";
$log .= "[1] Получено из Variable1: " . var_export($input, true) . "\n";

// 3. Декодируем HTML-сущности
$decoded = html_entity_decode($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$log .= "[2] После декодирования HTML-сущностей: " . var_export($decoded, true) . "\n";

// 4. Ищем название товара (содержимое между td тегами)
if (preg_match('/<td[^>]*>(.*?)<\/td>/', $decoded, $matches)) {
    $productName = strip_tags($matches[1]);
    $log .= "[3] Найдено название товара в первом td: " . var_export($productName, true) . "\n";
    $output = $productName;
} else {
    // 5. Альтернативный поиск - между квадратными скобками
    if (preg_match('/\[td\](.*?)\[\/td\]/', $decoded, $matches)) {
        $productName = $matches[1];
        $log .= "[3] Найдено название товара в [td]: " . var_export($productName, true) . "\n";
        $output = $productName;
    } else {
        // 6. Если не нашли, используем простую очистку
        $output = strip_tags($decoded);
        $log .= "[3] Использована простая очистка: " . var_export($output, true) . "\n";
    }
}

// 7. Удаляем лишнее (суммы, валюту и т.д.)
$cleanPatterns = [
    '/\d[\d\s]*[₽руб]/u', // суммы типа "3 000 000 ₽"
    '/Товар/ui',
    '/Сумма/ui',
    '/&nbsp;/',
    '/&#8381;/',
    '/₽/'
];

$output = preg_replace($cleanPatterns, '', $output);
$output = trim($output);
$output = preg_replace('/\s+/', ' ', $output);

$log .= "[4] После очистки от лишнего: " . var_export($output, true) . "\n";

// 8. Если результат пустой, пробуем другой подход
if (empty($output)) {
    // Разбиваем по строкам и берем первую содержательную
    $lines = preg_split('/[\r\n]+/', $decoded);
    foreach ($lines as $line) {
        $cleanLine = trim(strip_tags($line));
        if (!empty($cleanLine) && !preg_match('/^(Товар|Сумма|\d)/ui', $cleanLine)) {
            $output = $cleanLine;
            $log .= "[5] Найдено в строках: " . var_export($output, true) . "\n";
            break;
        }
    }
}

// 9. Сохраняем результат в Variable2
try {
    $this->SetVariable('Variable2', $output);
    $log .= "[6] Сохранение в Variable2: УСПЕШНО\n";
    $savedValue = $this->GetVariable('Variable2');
    $log .= "[7] Проверка Variable2: " . var_export($savedValue, true) . "\n";
} catch (Exception $e) {
    $log .= "[6] ОШИБКА сохранения: " . $e->getMessage() . "\n";
}

// 10. Сохраняем лог
$this->SetVariable('Variable3', $log);

// 11. Возвращаем результат
return $output;

В Variable1 мы принимаем данные из поля {{Товарные позиции (текст)}}
В Variable2 отдаем очищенное название
По желанию в Variable3 выводим логи