• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi Методы Парсинга В Delphi. Регулярные Выражения

Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,367
Баллы
155
Вот ты стоишь на пороге своих первых радостей программирования. Сделал Hello World, блокнот, и конечно же хочешь поработать с сетью. Неотъемлемой частью всех приложений, которые авторизируются или брутят, копируют или же информируют о новых сообщениях, является парсинг. Давайте разберёмся, что же это такое.

Не окунаясь в термины, парсинг - это распознавание текстовых данных по нужному тебе запросу, а затем копирование/удаление/сортировка этих, распознанных уже, данных. Не понятно? Ну например, дан огромный текст, положенный в memo, несколько тысяч символов. Среди этих символов нужно найти слово "кот", скопировать его и вставить в edit. Что ты будешь делать? Конечно не искать его руками. Скорее всего, сделаешь такой запрос:
Код:
if pos('кот', memo.text) <> 0 then ... (удаление, копирование, прочее).
Вот этот процесс и есть парсинг. Казалось бы, что тут сложного? Сложного - ничего, а вот если ты начинающий программист, то я могу показать несколько способов этого самого парсинга, что в дальнейшем упростит тебе работу с текстом, будь то код страницы или же обычный текстовый файл. Первый, это конечно, обычные и родные ещё из pascal'я строковые функции. В парсинге, чаще всего, используются 4 основных:
Код:
pos ('что', 'где'); //пример: pos('кот', memo1.text);
copy ('где', i, n); // где i - позиция символа, с которого начинать копирование, а N - количество символов
delete ('где', i, n);  //аналогично с предыдущим, но уже удаляет заданное кол-во символов
length (string); //где string - переменная типа String. Функция возвращает количество символов переданного ей слова/текста
Скорее всего всё это ты уже знаешь, так что следующий пример сложности у тебя не вызовет:
Код:
var s, st: string;
 
begin
s:= memo1.text;
delete(s, pos('кот', s)+3, length(s) );
st:= copy(s, pos('кот', s), length(s) );
end;
В первой строке мы удалили из переменной s всё, начиная от конца слова "кот". Во второй мы скопировали это слово. Именно так происходит парсинг какого-либо значения.

Теперь рассмотрим первую фишку, которая поможет тебе спарсить, например, все слова между какими-либо символами. За исходный текст возьмём исходный код какого-либо сайта, а парсить будем все ссылки. Ссылки у нас обычно между чего? Между кавычками, начинается с <a href=", а заканчивается "/> (пример: <a href=''ссылка"/>). Т.е. видим, что ссылка между 2-мя символами (набором символов). Нужно её оттуда достать. Для работы нам нужна библиотека regExpr. Скачать её можно будет в конце статьи.

Что такое регулярные выражения? Это некоторые выражения, которые позволяют указать, откуда и что вырывать. Пишутся они на специальном синтаксисе, который понять совсем не сложно.

Установили библиотеку, после чего в uses пишем RegExpr, а в Var создаём переменную reg: TregExpr; (тип регулярных выражений). Ну и пошли рассматривать пример:
Код:
var reg: TregExpr;
begin
reg:= TregExpr.Create; //Инициализируем переменную
reg.InputString:= memo1.text; //InputText - текст, в котором будем искать условия, удовлетворяющие регулярке
reg.Expression:='href="(.*?)"'; //регулярное выражение
if reg.Exec(memo1.text) then //Если найдено совпадение в memo1, то
repeat
memo2.lines.add(reg.Match[0]); добавляем в memo2 строку с совпадением
until not reg.ExecNext; //и так пока не закончатся совпадения (reg.NextExec - следующее совпадение)
end;
Вопросы? Вопросы конечно есть. Всё по порядку.

Инициализация, я надеюсь, понятна. Так же как и свойство InputText, отвечающее за текст, в котором будем искать ссылки. Текст мы выгрузили в него из memo1.

Далее самое интересное, сама регулярка. Задание регулярки берёт на себя свойство Expression.

Мы видим, что в регулярном выражении я указал следующее:
Код:
reg.Expression:='href="(.*?)"';
<a href=" - символы, с которых начинается ссылка

"> - символы, которыми она заканчивается. А вот загадочное (.*?) означает ЛЮБОЕ выражение, заключённое между этими символами. Вот если регулярка сработает на нём в тексте, то данное выражение ложится в свойство Match[0]. Где 0 -1-ое совпадение. Это не значит, что если в тексте будет вторая ссылка, то она ляжет в match[1], нет. Это значит, что всё, что попадёт под первое условие регулярки, будет лежать в [0].

Если, например, мы дополним запрос на такой:

reg.Expression:='href="(.*?)"(.*>)a'; , то второе условие - будет вот: "(.*>)a. Всё, что на нём сработает, будет находится в reg.match[1].

Проще говоря, сколько (.*?), сколько и условий. Ну что, теории достаточно? Проверим на практике.

Ну и вставляем весь тот код, что был оговорён выше:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var reg: TregExpr;
begin
reg:= TregExpr.Create;
reg.InputString:= memo1.text;
reg.Expression:='href="(.*?)"';
if reg.Exec then
repeat
memo2.lines.add(reg.Match[0]);
until not reg.ExecNext;
end;
Запускаем и видим, что все ссылки спарсены. На этом всё :)

Спасибо за внимание.
 
Андрей Оффлайн

Андрей

Принятый Кодер
Регистрация
17 Дек 2015
Сообщения
62
Баллы
60
Вот ты стоишь на пороге своих первых радостей программирования. Сделал Hello World, блокнот, и конечно же хочешь поработать с сетью. Неотъемлемой частью всех приложений, которые авторизируются или брутят, копируют или же информируют о новых сообщениях, является парсинг. Давайте разберёмся, что же это такое.

Не окунаясь в термины, парсинг - это распознавание текстовых данных по нужному тебе запросу, а затем копирование/удаление/сортировка этих, распознанных уже, данных. Не понятно? Ну например, дан огромный текст, положенный в memo, несколько тысяч символов. Среди этих символов нужно найти слово "кот", скопировать его и вставить в edit. Что ты будешь делать? Конечно не искать его руками. Скорее всего, сделаешь такой запрос:
Код:
if pos('кот', memo.text) <> 0 then ... (удаление, копирование, прочее).
Вот этот процесс и есть парсинг. Казалось бы, что тут сложного? Сложного - ничего, а вот если ты начинающий программист, то я могу показать несколько способов этого самого парсинга, что в дальнейшем упростит тебе работу с текстом, будь то код страницы или же обычный текстовый файл. Первый, это конечно, обычные и родные ещё из pascal'я строковые функции. В парсинге, чаще всего, используются 4 основных:
Код:
pos ('что', 'где'); //пример: pos('кот', memo1.text);
copy ('где', i, n); // где i - позиция символа, с которого начинать копирование, а N - количество символов
delete ('где', i, n);  //аналогично с предыдущим, но уже удаляет заданное кол-во символов
length (string); //где string - переменная типа String. Функция возвращает количество символов переданного ей слова/текста
Скорее всего всё это ты уже знаешь, так что следующий пример сложности у тебя не вызовет:
Код:
var s, st: string;

begin
s:= memo1.text;
delete(s, pos('кот', s)+3, length(s) );
st:= copy(s, pos('кот', s), length(s) );
end;
В первой строке мы удалили из переменной s всё, начиная от конца слова "кот". Во второй мы скопировали это слово. Именно так происходит парсинг какого-либо значения.

Теперь рассмотрим первую фишку, которая поможет тебе спарсить, например, все слова между какими-либо символами. За исходный текст возьмём исходный код какого-либо сайта, а парсить будем все ссылки. Ссылки у нас обычно между чего? Между кавычками, начинается с <a href=", а заканчивается "/> (пример: <a href=''ссылка"/>). Т.е. видим, что ссылка между 2-мя символами (набором символов). Нужно её оттуда достать. Для работы нам нужна библиотека regExpr. Скачать её можно будет в конце статьи.

Что такое регулярные выражения? Это некоторые выражения, которые позволяют указать, откуда и что вырывать. Пишутся они на специальном синтаксисе, который понять совсем не сложно.

Установили библиотеку, после чего в uses пишем RegExpr, а в Var создаём переменную reg: TregExpr; (тип регулярных выражений). Ну и пошли рассматривать пример:
Код:
var reg: TregExpr;
begin
reg:= TregExpr.Create; //Инициализируем переменную
reg.InputString:= memo1.text; //InputText - текст, в котором будем искать условия, удовлетворяющие регулярке
reg.Expression:='href="(.*?)"'; //регулярное выражение
if reg.Exec(memo1.text) then //Если найдено совпадение в memo1, то
repeat
memo2.lines.add(reg.Match[0]); добавляем в memo2 строку с совпадением
until not reg.ExecNext; //и так пока не закончатся совпадения (reg.NextExec - следующее совпадение)
end;
Вопросы? Вопросы конечно есть. Всё по порядку.

Инициализация, я надеюсь, понятна. Так же как и свойство InputText, отвечающее за текст, в котором будем искать ссылки. Текст мы выгрузили в него из memo1.

Далее самое интересное, сама регулярка. Задание регулярки берёт на себя свойство Expression.

Мы видим, что в регулярном выражении я указал следующее:
Код:
reg.Expression:='href="(.*?)"';
<a href=" - символы, с которых начинается ссылка

"> - символы, которыми она заканчивается. А вот загадочное (.*?) означает ЛЮБОЕ выражение, заключённое между этими символами. Вот если регулярка сработает на нём в тексте, то данное выражение ложится в свойство Match[0]. Где 0 -1-ое совпадение. Это не значит, что если в тексте будет вторая ссылка, то она ляжет в match[1], нет. Это значит, что всё, что попадёт под первое условие регулярки, будет лежать в [0].

Если, например, мы дополним запрос на такой:

reg.Expression:='href="(.*?)"(.*>)a'; , то второе условие - будет вот: "(.*>)a. Всё, что на нём сработает, будет находится в reg.match[1].

Проще говоря, сколько (.*?), сколько и условий. Ну что, теории достаточно? Проверим на практике.

Ну и вставляем весь тот код, что был оговорён выше:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var reg: TregExpr;
begin
reg:= TregExpr.Create;
reg.InputString:= memo1.text;
reg.Expression:='href="(.*?)"';
if reg.Exec then
repeat
memo2.lines.add(reg.Match[0]);
until not reg.ExecNext;
end;
Запускаем и видим, что все ссылки спарсены. На этом всё :)

Спасибо за внимание.
Скажи а где я могу скачать regExpr, я что то не вижу.
 
Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,367
Баллы
155
S Оффлайн

Sapphire

Принятый Кодер
Регистрация
22 Мар 2016
Сообщения
10
Баллы
30
Наконец то я нашел нормальный форум по делфи! Спасибо за тему , все хорошо понятно !
 
S Оффлайн

Slavik

Принятый Кодер
Регистрация
17 Июл 2017
Сообщения
7
Баллы
30
Код:
function FindBetween(text, text1, text2: string; index: Integer = 0): string;
var
  Pos1, Pos2, i: Integer;
begin
  Result := '';
  Pos2 := 1;
  for i := 0 to index do
  begin
    Pos1 := pos(text1, text, Pos2);
    if Pos1 = 0 then
    begin
      Result := '';
      Exit;
    end;
    Pos2 := pos(text2, text, Pos1 + 1 + Length(text1));
  end;
  Result := Copy(text, Pos1 + Length(text1), Pos2 - Pos1 - Length(text1));
end;
В большинстве случаев использую эту функцию, если нужно найти какие то данные в html, может кому пригодится text - текст для поиска, text1 - искать от, text2 - искать до, index - какое по порядку совпадение нужно
 
Вверх Снизу