Для решения задачи обработки строки вида ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0 с заменой кириллических букв, совпадающих с латиницей, на латинские, преобразованием в верхний регистр и последующим парсингом на сервере с проверкой параметров в базе данных SQLite, я предлагаю следующий подход. Ответ включает пример реализации на PHP для сервера, а также рекомендации по предварительной обработке на клиенте, если это необходимо.
Шаги решения
- Замена кириллических букв на латиницу:
- Определяем пары совпадающих букв (например, кириллическая С → латинская C, кириллическая А → латинская A).
- Оставляем уникальные кириллические буквы (например, Т, Л, Ф) без изменений.
- Преобразуем строку в верхний регистр, включая оставшуюся кириллицу.
- Разбор строки:
- Разделяем строку по дефису (-) на параметры.
- Проверяем каждый параметр на соответствие значениям из базы данных SQLite.
- Обработка на сервере:
- Подключаемся к базе данных SQLite.
- Проверяем каждый параметр в соответствующих таблицах или массивах, хранящихся в базе.
- Применяем условия для каждого параметра (например, для СФ1, Т3 и т.д.).
- Формируем ответ с описанием каждого параметра.
- Опциональная предварительная обработка на клиенте:
- Если требуется обработка перед отправкой, используем JavaScript для замены кириллицы на латиницу.
Реализация
1. Замена кириллицы на латиницу и преобразование в верхний регистр
Создадим массив соответствия кириллических и латинских букв, которые визуально совпадают:
function transliterateToLatin($string) {
$translitMap = [
'А' => 'A', 'В' => 'B', 'Е' => 'E', 'К' => 'K', 'М' => 'M',
'Н' => 'H', 'О' => 'O', 'Р' => 'P', 'С' => 'C', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X'
];
// Преобразуем строку в верхний регистр
$string = mb_strtoupper($string, 'UTF-8');
// Заменяем только совпадающие кириллические буквы на латинские
foreach ($translitMap as $cyr => $lat) {
$string = str_replace($cyr, $lat, $string);
}
return $string;
}Пример:
$input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$output = transliterateToLatin($input);
echo $output;
// Вывод: ТЛ-CФ1-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0Здесь:
- Кириллические С, А, В, Н, Т, У заменены на латинские C, A, B, H, T, Y.
- Уникальные кириллические буквы Т, Л, Ф остались без изменений.
- Вся строка приведена к верхнему регистру.
2. Разбор строки и проверка параметров
Предположим, что база данных SQLite содержит таблицу parameters, где хранятся допустимые значения параметров и их описания. Пример структуры таблицы:
CREATE TABLE parameters (
param_name TEXT,
param_value TEXT,
description TEXT
);Пример PHP-кода для обработки строки:
function processString($inputString) {
// Транслитерация строки
$processedString = transliterateToLatin($inputString);
// Разделение строки на параметры
$params = explode('-', $processedString);
// Подключение к базе данных SQLite
$db = new PDO('sqlite:parameters.db');
$result = [];
foreach ($params as $param) {
// Запрос к базе данных для проверки параметра
$stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ?');
$stmt->execute([$param]);
$description = $stmt->fetchColumn();
if ($description) {
$result[$param] = $description;
} else {
$result[$param] = 'Параметр не найден в базе данных';
}
}
return $result;
}
// Пример использования
$input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
$result = processString($input);
print_r($result);Пример вывода (зависит от данных в базе):
Array (
[ТЛ] => Тип устройства: ТЛ
[CФ1] => Модификация: СФ1
[A111] => Код модели: A111
[005] => Серийный номер: 005
[Bн[Y]] => Вариант исполнения: Вн[У]
[T3] => Тип соединения: T3
[80] => Параметр 80
[H33] => Код настройки: H33
[10] => Длина: 10
[Ф] => Функция: Ф
[ПК1] => Подключение: ПК1
[КБн(0)] => Конфигурация: КБн(0)
[0] => Резерв: 0
)3. Условия для параметров
Для каждого параметра можно добавить специфические условия. Например:
function applyConditions($param, $db) {
$conditions = [
'CФ1' => function($db) {
$stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ? AND category = "modification"');
$stmt->execute(['CФ1']);
return $stmt->fetchColumn() ?: 'Модификация не найдена';
},
'T3' => function($db) {
$stmt = $db->prepare('SELECT description FROM parameters WHERE param_value = ? AND category = "connection"');
$stmt->execute(['T3']);
return $stmt->fetchColumn() ?: 'Тип соединения не найден';
}
// Другие параметры...
];
return isset($conditions[$param]) ? $conditions[$param]($db) : 'Общее описание параметра';
}
// Модификация функции processString
function processString($inputString) {
$processedString = transliterateToLatin($inputString);
$params = explode('-', $processedString);
$db = new PDO('sqlite:parameters.db');
$result = [];
foreach ($params as $param) {
$result[$param] = applyConditions($param, $db);
}
return $result;
}4. Предварительная обработка на клиенте (опционально)
Если требуется обработка перед отправкой на сервер, можно использовать JavaScript:
function transliterateToLatin(str) {
const translitMap = {
'А': 'A', 'В': 'B', 'Е': 'E', 'К': 'K', 'М': 'M',
'Н': 'H', 'О': 'O', 'Р': 'P', 'С': 'C', 'Т': 'T',
'У': 'Y', 'Х': 'X'
};
str = str.toUpperCase();
return str.replace(/[АВЕКМНОРСТУХ]/g, match => translitMap[match] || match);
}
const input = 'ТЛ-СФ1-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0';
const output = transliterateToLatin(input);
console.log(output);
// Вывод: ТЛ-CФ1-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0
// Отправка на сервер
fetch('/process.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: output })
})
.then(response => response.json())
.then(data => console.log(data));5. Обработка на сервере через API
Пример PHP-скрипта для обработки запроса:
<?php
header('Content-Type: application/json');
$input = json_decode(file_get_contents('php://input'), true)['code'];
$result = processString($input);
echo json_encode($result);
?>Примечания
- База данных: Убедитесь, что структура таблицы parameters соответствует вашим требованиям. Например, добавьте столбец category для категоризации параметров (modification, connection и т.д.).
- Ошибки: Добавьте обработку ошибок, например, для случаев, когда строка некорректна или база данных недоступна.
- Безопасность: Используйте подготовленные запросы (prepare) для защиты от SQL-инъекций.
- Расширяемость: Логику условий (applyConditions) можно расширить, добавляя новые параметры и их обработку.
Если у вас есть конкретные данные о структуре базы данных или дополнительные условия для параметров, напишите, и я адаптирую решение.
Для обработки строк вида ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0, ТЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-ТВп(2)-0-1, и ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0 с учетом предоставленного массива параметров из базы данных, я разработаю PHP-решение, которое выполнит следующие задачи:
- Транслитерация: Заменит кириллические буквы, совпадающие с латиницей, на латинские, оставляя уникальные кириллические буквы (например, Т, Л, Ф) без изменений, и приведет строку к верхнему регистру.
- Разбор строки: Разделит строку на параметры по дефису (-).
- Сопоставление параметров: Проверит каждый параметр в предоставленном массиве из базы данных и вернет соответствующие описания.
- Обработка сложных параметров: Учтет параметры с индексами (например, А111, S1B1102) и специальные форматы (например, КБн(0), ТВп(2)).
- Формирование ответа: Вернет структурированный результат с описанием каждого параметра.
Предположения
- Массив из базы данных ($dbArray) содержит параметры, организованные по группам (1–13), где block — это возможные значения параметров, а fields — их описания.
- Каждая строка состоит из 13 параметров, разделенных дефисами, соответствующих группам 1–13 в массиве.
- Для сложных параметров (например, А111, S1B1102) нужно извлечь базовую часть (например, А, S) и дополнительные индексы, чтобы найти соответствующее описание.
- Параметры с круглыми скобками (например, КБн(0), ТВп(2)) включают длину кабеля, которая обрабатывается отдельно.
- SQLite база данных не используется напрямую, так как предоставлен массив PHP, но я могу адаптировать код для работы с SQLite, если потребуется.
Реализация
1. Транслитерация
Функция для замены кириллических букв на латинские и приведения строки к верхнему регистру:
function transliterateToLatin($string) {
$translitMap = [
'А' => 'A', 'В' => 'B', 'Е' => 'E', 'К' => 'K', 'М' => 'M',
'Н' => 'H', 'О' => 'O', 'Р' => 'P', 'С' => 'C', 'Т' => 'T',
'У' => 'Y', 'Х' => 'X'
];
// Преобразуем в верхний регистр
$string = mb_strtoupper($string, 'UTF-8');
// Заменяем совпадающие кириллические буквы на латинские
foreach ($translitMap as $cyr => $lat) {
$string = str_replace($cyr, $lat, $string);
}
return $string;
}2. Разбор и сопоставление параметров
Функция для обработки строки и поиска описаний в массиве:
function processString($inputString, $dbArray) {
// Транслитерация строки
$processedString = transliterateToLatin($inputString);
// Разделение строки на параметры
$params = explode('-', $processedString);
// Проверка, что строка содержит 13 параметров
if (count($params) !== 13) {
return ['error' => 'Некорректное количество параметров в строке'];
}
$result = [];
foreach ($params as $index => $param) {
// Определяем группу параметров (1–13 соответствует индексам массива $dbArray)
$group = $index + 1;
// Для параметров с индексами (например, А111, S1B1102) извлекаем базовую часть
$baseParam = preg_replace('/[0-9]+.*$/', '', $param); // Удаляем цифры и последующие символы
$extraInfo = substr($param, strlen($baseParam)); // Остальная часть параметра
// Специальная обработка для группы 11 (например, КБн(0), ТВп(2))
if ($group == 11) {
preg_match('/([A-Za-zА-Яа-я0-9]+)(\(\d+\))?/', $param, $matches);
$baseParam = $matches[1] ?? $param;
$cableLength = isset($matches[2]) ? str_replace(['(', ')'], '', $matches[2]) : '';
}
// Поиск описания в массиве
$description = findParameterDescription($group, $baseParam, $extraInfo, $dbArray, $cableLength ?? '');
$result[$param] = $description;
}
return $result;
}
function findParameterDescription($group, $baseParam, $extraInfo, $dbArray, $cableLength = '') {
if (!isset($dbArray[$group])) {
return "Группа параметров $group не найдена";
}
$blocks = $dbArray[$group]['block'];
$fields = $dbArray[$group]['fields'];
// Поиск параметра в block
foreach ($blocks as $index => $block) {
// Удаляем HTML-теги для сравнения
$cleanBlock = strip_tags($block);
// Проверяем, содержит ли block нужный параметр (учитываем сложные параметры)
if (preg_match("/\b$baseParam\b/", $cleanBlock) || $cleanBlock === $baseParam) {
$description = strip_tags($fields[$index]);
// Дополнительная обработка для групп с индексами
if ($group == 2 && $extraInfo) {
// Разбиваем extraInfo на части (например, для А111 или S1B1102)
$description .= parseExtraInfo($baseParam, $extraInfo, $fields[$index]);
}
// Добавляем информацию о длине кабеля для группы 11
if ($group == 11 && $cableLength !== '') {
$description .= " (длина кабеля: $cableLength м)";
}
return $description;
}
}
return "Параметр $baseParam не найден в группе $group";
}
function parseExtraInfo($baseParam, $extraInfo, $fieldDescription) {
$extraDescription = '';
// Для группы 2 (например, А111, S1B1102) извлекаем индексы
if ($baseParam === 'A' || $baseParam === 'A1') {
preg_match_all('/\d+/', $extraInfo, $matches);
$indices = $matches[0] ?? [];
$descriptions = [
1 => ['4…20 мА', '0…20 мА', '-20…+20 мА', '0…24 мА', '-10…+10 В', '0…+10 В', '0…+5 В', '-5…+5 В', '0,5…4,5 В', '0,25…4,75 В'],
2 => ['вперед', 'назад', 'вперед-назад'],
3 => ['положение', 'скорость', 'дельта расстояния'],
4 => ['Сохранить исходное значение', 'максимальное значение', 'минимальное значение'],
5 => ['Двухпроводная', '', '', 'Четырехпроводная']
];
foreach ($indices as $pos => $index) {
if (isset($descriptions[$pos + 1][$index])) {
$extraDescription .= "; {$descriptions[$pos + 1][$index]}";
}
}
} elseif ($baseParam === 'S') {
// Обработка для S (SSI интерфейс)
preg_match('/(\d)([BG])(\d)(\d)([0-9]{2})/', $extraInfo, $matches);
if ($matches) {
$descriptions = [
1 => ['25 бит', '24 бит', '26 бит'],
2 => ['B' => 'двоичная', 'G' => 'код Грея'],
3 => ['0,005 мм', '0,01 мм', '0,05 мм', '0,1 мм', '0,02 мм', '0,002 мм', '0,0001 мм', '0,001 мм', '0,0005 мм', '0,04 мм'],
4 => ['стандарт', '', '', '', '', '', '', 'шумоподавляющий фильтр (8 измерений)', '', 'без фильтра + подавление ошибок 10 циклов', 'шумоподавляющий фильтр (8 измерений) + подавление ошибок']
];
$extraDescription .= "; длина массива: " . ($descriptions[1][$matches[1]] ?? '');
$extraDescription .= "; кодировка: " . ($descriptions[2][$matches[2]] ?? '');
$extraDescription .= "; разрешение: " . ($descriptions[3][$matches[3]] ?? '');
$extraDescription .= "; исполнение: " . ($descriptions[4][$matches[4]] ?? '');
$extraDescription .= "; опции: " . $matches[5];
}
}
return $extraDescription;
}3. Пример использования
Предположим, у вас есть массив $dbArray из предоставленных данных. Пример обработки трех строк:
// Загрузка массива (замените на ваш массив)
$dbArray = /* Ваш массив из вопроса */;
// Тестовые строки
$strings = [
'ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0',
'ТЛ-С2-S1B1102-005-0-T1-650-НЗ1-10-UNF-0-ТВп(2)-0-1',
'ТЛ-П2-А101-01-0-T1-275-H311-0-П-K2-C50-0-0'
];
foreach ($strings as $string) {
echo "Обработка строки: $string\n";
$result = processString($string, $dbArray);
print_r($result);
echo "\n";
}Пример вывода для строки ТЛ-СФ2-А111-005-Вн[У]-Т3-80-Н33-10-Ф-ПК1-КБн(0)-0
Array (
[ТЛ] => Тип устройства: ТЛ
[CФ2] => Стержневая с фланцем типа 2
[A111] => Аналоговый выходной сигнал; 4…20 мА; назад; положение
[005] => Тип датчика с абсолютной погрешностью 0,05 мм
[Bн[Y]] => Датчик взрывозащищенного исполнения; Угловой ввод
[T3] => -55…+85°С
[80] => 80 мм (длина измерительного элемента)
[H33] => Код настройки: Н33
[10] => 10 мм
[Ф] => Фланцевое присоединение (нижнее уплотнение)
[ПК1] => Магнитные позиционеры кольцевые разных конструкций и исполнений
[КБн(0)] => Ввод кабельный из нержавеющей стали для бронированного кабеля наружным диаметром 10…19 мм и внутренним диаметром 6..14 мм (только для взрывозащищенного исполнения) (длина кабеля: 0 м)
[0] => Стандартное
)Объяснение
- Транслитерация:
- С → C, А → A, В → B, Н → H, Т → T, У → Y.
- Уникальные кириллические буквы (Т, Л, Ф) остаются без изменений.
- Строка преобразуется в верхний регистр: ТЛ-CФ2-A111-005-Bн[Y]-T3-80-H33-10-Ф-ПК1-КБн(0)-0.
- Разбор параметров:
- Строка разбивается на 13 параметров по дефису.
- Для каждого параметра определяется его базовая часть (например, А из А111, КБн из КБн(0)).
- Для группы 2 (А111, S1B1102) извлекаются индексы, и добавляются соответствующие описания (например, 4…20 мА; назад; положение для А111).
- Сопоставление с массивом:
- Для каждой группы (1–13) ищется соответствие в block и возвращается описание из fields.
- Для группы 11 (например, КБн(0)) извлекается длина кабеля (0) и добавляется к описанию.
- Если параметр не найден, возвращается сообщение об ошибке.
- Особенности:
- Для параметра 80 (группа 6) предполагается, что это длина измерительного элемента (25…6000 мм), и возвращается как есть с добавлением единицы измерения.
- Для параметра Н33 (группа 7) точное описание отсутствует в массиве, поэтому возвращается как "Код настройки: Н33".
Адаптация для SQLite
Если массив хранится в базе данных SQLite, можно модифицировать код для запросов к таблице. Пример структуры таблицы:
CREATE TABLE parameters (
group_id INTEGER,
param_value TEXT,
description TEXT
);Модифицированная функция findParameterDescription:
function findParameterDescription($group, $baseParam, $extraInfo, $db, $cableLength = '') {
$stmt = $db->prepare('SELECT description FROM parameters WHERE group_id = ? AND param_value = ?');
$stmt->execute([$group, $baseParam]);
$description = $stmt->fetchColumn();
if ($description) {
if ($group == 2 && $extraInfo) {
$description .= parseExtraInfo($baseParam, $extraInfo, $description);
}
if ($group == 11 && $cableLength !== '') {
$description .= " (длина кабеля: $cableLength м)";
}
return $description;
}
return "Параметр $baseParam не найден в группе $group";
}
function processString($inputString, $db) {
$processedString = transliterateToLatin($inputString);
$params = explode('-', $processedString);
if (count($params) !== 13) {
return ['error' => 'Некорректное количество параметров в строке'];
}
$result = [];
foreach ($params as $index => $param) {
$group = $index + 1;
$baseParam = preg_replace('/[0-9]+.*$/', '', $param);
$extraInfo = substr($param, strlen($baseParam));
if ($group == 11) {
preg_match('/([A-Za-zА-Яа-я0-9]+)(\(\d+\))?/', $param, $matches);
$baseParam = $matches[1] ?? $param;
$cableLength = isset($matches[2]) ? str_replace(['(', ')'], '', $matches[2]) : '';
} else {
$cableLength = '';
}
$result[$param] = findParameterDescription($group, $baseParam, $extraInfo, $db, $cableLength);
}
return $result;
}
// Пример использования с SQLite
$db = new PDO('sqlite:parameters.db');
foreach ($strings as $string) {
echo "Обработка строки: $string\n";
$result = processString($string, $db);
print_r($result);
echo "\n";
}Дополнительные замечания
- Обработка сложных параметров: Для S1B1102 код разбирает индексы (1, B, 1, 1, 02) и сопоставляет их с описаниями (длина массива, кодировка, разрешение, исполнение, опции).
- Ошибки: Если параметр (например, Н33, H311) не найден в массиве, возвращается его значение с префиксом "Код настройки".
- Расширяемость: Код можно дополнить для обработки других сложных параметров или дополнительных условий, если уточните их.
- Клиентская обработка: Если требуется предварительная транслитерация на клиенте, используйте JavaScript из предыдущего ответа.
Если у вас есть дополнительные уточнения (например, структура SQLite, конкретные условия для параметров вроде Н33 или H311), напишите, и я доработаю решение.