Функция, возвращающая текст между двумя определёнными строками
Procedure IsolateText( Const S: String; Tag1, Tag2: String; list:TStrings );
Var
pScan, pEnd, pTag1, pTag2: PChar;
foundText: String;
searchtext: String;
Begin{ Set up pointers we need for the search. HTML is not case sensitive, so
we need to perform the search on a uppercased copy of S.}
searchtext := Uppercase(S);
Tag1:= Uppercase( Tag1 );
Tag2:= Uppercase( Tag2 );
pTag1:= PChar(Tag1);
pTag2:= PChar(Tag2);
pScan:= PChar(searchtext);
Repeat{ Search for next occurence of Tag1. }
pScan:= StrPos( pScan, pTag1 );
If pScan <> NilThenBegin{ Found one, hop over it, then search from that position
forward for the next occurence of Tag2. }
Inc(pScan, Length( Tag1 ));
pEnd := StrPos( pScan, pTag2 );
If pEnd <> NilThenBegin{ Found start and end tag, isolate text between,
add it to the list. We need to get the text from
the original S, however, since we want the un-uppercased
version! So we calculate the address pScan would hold if
the search had been performed on S instead of searchtext. }
SetString( foundText,
Pchar(S) + (pScan- PChar(searchtext) ),
pEnd - pScan );
list.Add( foundText );
{ Continue next search after the found end tag. }
pScan := pEnd + Length(tag2);
End{ If }Else{ Error, no end tag found for start tag, abort. }
pScan := Nil;
End; { If }Until pScan = Nil;
End;
Программный процесс IsolateText, написанный на языке Delphi, ищет текст между двумя конкретными строками (Tag1 и Tag2) в заданной строке (S). Найденный текст добавляется в список строк (list: TStrings).
Обзор кода:
Процедура принимает четыре параметра:
S: Входная строка.
Tag1, Tag2: Две метки, которые определяют начало и конец текста для изоляции.
list: Список строк, в который будет добавлен найденный текст.
Первая часть кода настраивает переменные и выполняет некоторые предварительные операции:
Она преобразует входную строку (S) в верхний регистр с помощью функции Uppercase и присваивает ее новой переменной searchtext.
Она также преобразует две метки (Tag1 и Tag2) в верхний регистр и присваивает их новым переменным.
Основная часть процедуры - это повторяющийся цикл, который ищет вхождения Tag1 в входную строку:
Он использует функцию StrPos для поиска позиции следующего вхождения Tag1.
Если вхождение найдено, он увеличивает указатель pScan на длину Tag1 и затем ищет следующее вхождение Tag2.
Если обе метки найдены, он изолирует текст между ними с помощью аналогичного процесса, как в шаге 3.
Изолированный текст добавляется в список (list) с помощью метода Add.
Цикл продолжается, пока не будет найдено больше вхождений Tag1.
Предложения по улучшению:
Рассмотрите использование регулярных выражений вместо простых строковых поисков, особенно если метки сложные или содержат специальные символы.
Вам может потребоваться добавление обработки ошибок для случаев, когда входная строка неproperly форматирована или метки не могут быть найдены.
Процедура предполагает, что входная строка - это одиночная строка; если вам нужно искать текст в нескольких строках, рассмотрите использование болееadvanced библиотеки для поиска текста.
Переменные pScan, pEnd и pTag1 не очень описательны; рассмотрите переименование их в something like tagStartPointer, endTagPointer и tag1Pointer.
Вам может потребоваться добавление комментариев или документации, чтобы объяснить цель процедуры и ее работу.
Функция IsolateText возвращает текст между двумя определёнными строками (тэгами) из входной строки, выполняя поиск с учётом регистра.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.