Извлечь Текст Из HTML
Работа со строками в БСП 3.0
Общий модуль СтроковыеФункцииКлиентСервер
При работе c HTML файлами из интернета часто приходится извлекать текст в формте HTML , очищенный от тегов, скриптов и заголовков для сохраненеия при необходимости в переменной типа строка с неограниченной длиной. .
ТекстСодержания = СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML( ИсходныйТекстHTML);
Функцция очищает текст в формате HTML от тегов и возвращает неформатированный текст.
Параметры:
ИсходныйТекстHTML – Строка – текст в формате HTML.
Возвращаемое значение: Строка – текст, очищенный от тегов, скриптов и заголовков.
Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт Результат = "";Текст = НРег(ИсходныйТекст); // отрезаем все что не body
Позиция = СтрНайти(Текст, "<body");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 5);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5);
Позиция = СтрНайти(Текст, ">");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
КонецЕсли;
КонецЕсли;
Позиция = СтрНайти(Текст, "</body>");
Если Позиция > 0 Тогда
Текст = Лев(Текст, Позиция - 1);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1);
КонецЕсли; // вырезаем скрипты
Позиция = СтрНайти(Текст, "<script");
Пока Позиция > 0 Цикл
ПозицияЗакрывающегоТега = СтрНайти(Текст, "</script>");
Если ПозицияЗакрывающегоТега = 0 Тогда // Не найден закрывающий тег - вырезаем оставшийся текст.
ПозицияЗакрывающегоТега = СтрДлина(Текст);
КонецЕсли;
Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9);
Позиция = СтрНайти(Текст, "<script");
КонецЦикла; // вырезаем стили
Позиция = СтрНайти(Текст, "<style");
Пока Позиция > 0 Цикл
ПозицияЗакрывающегоТега = СтрНайти(Текст, "</style>");
Если ПозицияЗакрывающегоТега = 0 Тогда // Не найден закрывающий тег - вырезаем оставшийся текст.
ПозицияЗакрывающегоТега = СтрДлина(Текст);
КонецЕсли;
Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8);
ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8);
Позиция = СтрНайти(Текст, "<style");
КонецЦикла; // вырезаем все теги
Позиция = СтрНайти(Текст, "<");
Пока Позиция > 0 Цикл
Результат = Результат + Лев(ИсходныйТекст, Позиция-1);
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
Позиция = СтрНайти(Текст, ">");
Если Позиция > 0 Тогда
Текст = Сред(Текст, Позиция + 1);
ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
КонецЕсли;
Позиция = СтрНайти(Текст, "<");
КонецЦикла;
Результат = Результат + ИсходныйТекст;
МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина);
Возврат СокрЛП(СтрСоединить(МассивСтрок, Символы.ПС));
КонецФункции
В теле данной функции есть вызов другой функции РазложитьСтрокуВМассивПодстрок
Функция РазложитьСтрокуВМассивПодстрок разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину. В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
рекомендуется использовать функцию платформы СтрРазделить.
Параметры данной функции:
Значение – Строка – текст с разделителями;
Разделитель – Строка – разделитель строк текста, минимум 1 символ;
ПропускатьПустыеСтроки – Булево – признак необходимости включения в результат пустых строк.
Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
– для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки включаются в результат;
– если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в случае разделителя-пробела результатом функции будет массив, содержащий одно значение “” (пустая строка), а при других разделителях результатом функции будет пустой массив.
СокращатьНепечатаемыеСимволы – Булево – сокращать непечатаемые символы по краям каждой из найденных подстрок.
Возвращаемое значение:
Массив – массив строк.
Пример:
Результат = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ","); // возвратит массив из 5 элементов, три из которых - пустые: "", "один", "", "два", ""; СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) // - возвратит массив из двух элементов: "один", "два"; // СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один два ", " ") // - возвратит массив из двух элементов: "один", "два"; // СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("") // - возвратит пустой массив; // СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь) // - возвратит массив с одним элементом: ""(пустая строка); // СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ") // - возвратит массив с одним элементом: "" (пустая строка). //
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) ЭкспортЕсли Разделитель = "," И ПропускатьПустыеСтроки = Неопределено И СокращатьНепечатаемыеСимволы Тогда
Результат = СтрРазделить(Значение, ",", Ложь);
Для Индекс = 0 По Результат.ВГраница() Цикл
Результат[Индекс] = СокрЛП(Результат[Индекс])
КонецЦикла;
Возврат Результат;
КонецЕсли;
Результат = Новый Массив;
// Для обеспечения обратной совместимости.
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Значение) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = СтрНайти(Значение, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Значение, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Подстрока));
Иначе
Результат.Добавить(Подстрока);
КонецЕсли;
КонецЕсли;
Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
Позиция = СтрНайти(Значение, Разделитель); КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
Если СокращатьНепечатаемыеСимволы Тогда
Результат.Добавить(СокрЛП(Значение));
Иначе
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
См. также