Печать
Родительская категория: Статьи
Категория: 1C

Рассмотрим один из видов парсинга html файлов при помощи регулярных выражений.

Регулярные выражения – это формальный язык поиска и осуществления манипуляций с подстроками в тексте.

Платформа 1С использует стандартные компоненты регулярных выражений Visual Basic, которые подключаются как COM объект (VBScript.RegExp).

Основные свойства объекта RegExp:

Global  - Определяет продолжительность поиска (False – до первого совпадения, True – по всему тексту, значение по умолчанию: False)

IgnoreCase - Определяет чувствительность к регистру символов (False – учитывать регистр, True – не учитывать регистр, значение по умолчанию: False)

Multiline - Определяет структуру объекта (False – однострочный, True – многострочный , значение по умолчнанию: False)

Pattern - Строка, используемая как шаблон. Именно при помощи Pattern мы задаем маску для искомых фрагментов текста.

 

Таблица основных специальных символов (метасимволов) для создания шаблона:

 

^    Начало строки

$    Конец строки

?    Ни одного или один любой символ

*    Ни одного или несколько любых символов

+    Один или несколько любых символов

.     Любой символ, кроме знака “новая строка”

    Определяет интервал символов

|     Знак “или”

{n}     Точное количество символов, стоящих перед {n}

{n,m}     Количество от n до m символов, стоящих перед {n,m}

[abc]     Любой из указанных символов

[^abc]   Любой из неуказанных символов

[a-z]     Любой символ из диапазона

[^a-z]   Любой символ, не входящий в диапазон

\b     Конец слова

\B     Не конец слова

\d     Цифра

\D     Не цифра

\w     Любая буква, цифра или знак подчеркивания

\W    Не буква, не цифра и не знак подчеркивания

\s      Пробел

\S     Не пробел

 

Например.

<h2\b[^>]*>.+</h2>

Данный шаблон будет искать все заголовки 2го уровня, т.е. любой текст заключенный в html тэги <h2> и </h2>.

 

<[^>]*>

А данный шаблон просто ищет все что помещено в какие-либо html тэги.

 

Методы объекта RegExp:

Execute() - Возвращает коллекцию найденных по шаблону подстрок

Replace() - Возвращает строку, в которой найденные по шаблону вхождения в исходной строке заменены на указанную подстроку

Test() - Возвращает булево значение как результат проверки соответствия строки шаблону

 

Рассмотрим живой пример.

Прочитаем файл test.html и выведем из него все заголовки 2го уровня.

На 1С данный код будет выглядеть следующим образом:


//Указываем путь к файлу
    ВыбранныйФайл = "C:\test.html";                   
   
    ПрочитанныйТекст = Новый ЧтениеТекста(ВыбранныйФайл, КодировкаТекста.Системная);
    СтрокаТекстовогоФайла = ПрочитанныйТекст.ПрочитатьСтроку();
    //Создаем массив из строк файла;
    СчетчикСтрок = 0;
    МассивСтрок = Новый Массив;
    Пока Истина Цикл
        Строка = ПрочитанныйТекст.ПрочитатьСтроку();
        Если Строка = Неопределено Тогда
            Прервать;
        Иначе
            МассивСтрок.Добавить(Строка);
            СчетчикСтрок = СчетчикСтрок + 1;
        КонецЕсли;
    КонецЦикла;
    // Создаем COMОбъект для Регулярных выражений
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.IgnoreCase = Истина;
    RegExp.Global = Истина;
    RegExp.Multiline = Истина;
   
    ПолученныеСовпадения = Новый Массив;
   
    //заголовки 2 уровня
    //Идем по строкам и ищем <h2...>...</h2>
    Для Каждого ПроверяемаяСтрока Из МассивСтрок Цикл       
       
        Шаблон = "<h2\b[^>]*>.+</h2>"; //Шаблон для поиска заголовка h2
        Шаблон2 = "<[^>]*>"; //Шаблон для удаления тэгов <h2> из найденного заголовка
        RegExp.Pattern = Шаблон;
       
        Matches=RegExp.Execute(ПроверяемаяСтрока);   
        Если Не RegExp.Test(ПроверяемаяСтрока) Тогда
            Продолжить
        Иначе                
            Для n = 0 По Matches.Count()-1 Цикл
                Match = Matches.Item(n);
                стр = (Match.Value);
                RegExp.Pattern = Шаблон2;
                Заголовок2Уровня = RegExp.Replace(стр, "");
                ПолученныеСовпадения.Добавить(Заголовок2Уровня);
            КонецЦикла;
        КонецЕсли;           
    КонецЦикла;
   
    Для Каждого Значение Из ПолученныеСовпадения Цикл
        Сообщить(Значение)
    КонецЦикла;

 

Рассмотрим подробнее, что мы сделали. После того как мы указали путь к файлу, мы считываем его построчно. Проходим циклом все строки и записываем каждую в массив (МассивСтрок).

Затем подключаем COM объект VBScript.RegExp, задаем свойства и идем уже по массиву строк, ищем совпадения по шаблону 1 и в случае нахождения совпадения – удаляем html тэги по шаблону 2.