Этот скрипт одновременно заменяет несколько слов (например, «кроссовки», «футболка», «джинсы») на новые варианты («кеды», «топ», «джинсовка») в названиях товаров, корректно сохраняя регистр каждого слова (например, «Футболка» → «Топ», «ДЖИНСЫ» → «ДЖИНСОВКА»), при этом затрагивая только целые слова, а не их части.
Код |
---|
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Iblock\ElementTable;
if (CModule::IncludeModule("iblock")) {
$iblockId = 2; // ID инфоблока с товарами
$replacements = [
"кроссовки" => "кеды",
"футболка" => "топ",
"джинсы" => "джинсовка"
];
$arFilter = [
"IBLOCK_ID" => $iblockId,
"ACTIVE" => "Y",
"NAME" => array_keys($replacements) // Поиск по любому из ключевых слов
];
$elements = CIBlockElement::GetList(
[],
$arFilter,
false,
false,
["ID", "NAME"]
);
while ($element = $elements->GetNext()) {
$newName = $element['NAME'];
foreach ($replacements as $search => $replace) {
// Проверяем, есть ли целое слово для замены (с учётом границ слова и регистра)
$pattern = '/(?<=^|\P{L})' . preg_quote($search, '/') . '(?=\P{L}|$)/ui';
$newName = preg_replace_callback($pattern, function($matches) use ($replace, $search) {
$original = $matches[0];
if (mb_strtoupper($original, 'UTF-8') === $original) {
return mb_strtoupper($replace, 'UTF-8');
} elseif (mb_strtolower($original, 'UTF-8') === $original) {
return mb_strtolower($replace, 'UTF-8');
} else {
return mb_strtoupper(mb_substr($replace, 0, 1), 'UTF-8') . mb_substr($replace, 1);
}
}, $newName);
}
if ($newName !== $element['NAME']) {
CIBlockElement::SetPropertyValuesEx($element['ID'], $iblockId, []);
$el = new CIBlockElement();
$el->Update($element['ID'], ['NAME' => $newName]);
echo "Обновлено: '{$element['NAME']}' → '{$newName}'<br>";
}
}
}
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");
?> |