Визначення віку домена. RegExp в Delphi 2010, Різне, Програмування, статті

Джерело: webdelphi


Сьогодні нарешті пересилив себе і вирішив все-таки вивчити питання використання регулярних виразів в Delphi.


Скільки разів не вивчав літературу по використанню RegExp, Складання регулярних виразів тощо, завжди здавалося, що скласти регулярний вираз жахливо складно, а розібратися у вже написаному вираженні – просто нереально. А тут сів і буквально за годину з невеликим більш-менш розібрався м склав необхідне регулярне вираження.


1. Додаємо RegExp в Delphi 2010.


Перш, ніж почати програмувати, необхідно додати в Delphi бібліотеку типів. Для цього запускаємо Delphi і вибираємо в меню “Componet – Import Component ..” У вікні вибираємо “Import a Ty pe Library “і тиснемо кнопку Next >> У списку доступних бібліотек необхідно знайти бібліотеку Microsoft VBScript Regular Expressions 5.5 . Знаходимо, вибираємо і тиснемо “Next >>”.
Тепер Ви можете створити невізуальних компонент Delphi 2010 для роботи з імпортованої бібліотекою. Для цього необхідно задати сторінку палітри компонентів на якій буде розташований компонент, поставити галочку “Generate Component Wrappers” і натиснути “Next >> “. Я не став створювати новий компонент, тому пропустив цей крок просто натиснувши кнопку продовження в новому вікні залишив опцію за замовчуванням” Create Unit “. Після того як буде натиснута кнопка “Finish” Delphi створить новий модуль з досить великим описом і не менш громіздким назвою – VBScript_RegExp_55_TLB . Цей модуль необхідно підключити до проекту, щоб отримати доступ до роботи з регулярними виразами в Delphi. Підключаємо модуль і переходимо до другого кроку – вивчення сайту з якого будемо “витягати” інформацію по домену.


2. Вивчаємо сайт на предмет наявності та розташування інформації


Отже, для вирішення поставленого завдання нам необхідно знати тільки одне – дату реєстрації домена.


Я не став довго копирсатися в пошуках whois-сервера і вибрав в якості мети who.is – досить зручний сервіс, який, в разі необхідності, можна буде використовувати для вирішення інших завдань при роботі з доменними іменами.


Тепер перевіримо як виглядає сторінка з необхідною інформацією. Забиваємо в рядок пошуку будь домен, наприклад webdelphi.ru і тиснемо “Who is Search”. У підсумку отримуємо сторінку такого змісту:



Червоним кольором виділена необхідна нам рядок (рисунок клікабельним) – дата створення домену. Здавалося б все просто – знайшов рядок, витягнув дату і справа в капелюсі. Але, якщо б все було так просто – був би рай Спробуйте тепер знайти інформацію, наприклад по домену yahoo.com і вид сторінки з інформацією буде вже іншою. Наприклад замість рядка created буде Creation Date, а, якщо заглянути у вихідний код, то для першого випадку (webdelphi.ru) вихідний код рядка буде зовсім інший ніж для другого – Зверніть увагу на те, як прописані прогалини.


Відповідно, для того, щоб парсити подібні сторінки в пошуках дати створення домену необхідно або мати під рукою два регулярних вирази – кожне для свого випадку (що вельми не раціонально і не факт, що спрацює), або створити одне більш-менш універсальне, яке підійде для всіх випадків. Я написав таке регулярний вираз, яке і представляю на Ваше огляд.


3. Регулярний вираз для пошуку дати створення домену


Отже, у мене вийшло ось таке регулярний вираз:

“^CD+(d{4}.d{2}.d{2})/Cw{7,8}sw{4}:D+(d{4}-d{2}-d{2})”

Регулярний вираз складається з двох частин:


Перша частина – для пошуку дати створення домену в підрядку, що містить “created”:

“^CD+(d{4}.d{2}.d{2})”

тобто шукається підрядок, що починається з символу С, потім в рядку повинно міститися 1 або більше символів (не цифр) і безпосередньо сама дата створення домену в форматі yyyy.mm.dd причому в регулярному виразі вказано явно, що роздільником виступає символ “.”


Друга частина регулярного вираження шукає дати в рядках, що містять підрядок “Creation Date”:

“Cw{7,8}sw{4}:D+(d{4}-d{2}-d{2})”

Тут знову ж таки першим символом повинен бути символ “С”, далі зазначено, що в рядку повинні йти поспіль 7 або 8 букв, потім простий пробіл, ще 4 букви, двокрапка, 1 або кілька символів і сама дата в форматі yyyy-mm-dd Роздільник знову ж вказаний явно.


Цілком можливо, що це регулярний вираз не саме витончене і правильне, але тому це мій перший досвід у їх складанні, то буду вдячний, якщо хто-небудь вкаже більш правильний варіант регулярки.


Тепер, маючи під рукою регулярний вираз, можна приступати до написання програми.


4. Пишемо програму для визначення віку домену


Додаток наше буде вважати вік домену в днях і виглядати досить простенько:



Ім’я домену задається без http:// як це і повинно бути. Після натискання на кнопку “Перевірити” будемо виписувати в label “и дату реєстрації та вік домену. Розташуйте необхідні компоненти на формі і приступимо до програмування.


По суті, для роботи програми необхідно описати всього одна подія – клік по кнопці. Процедура виглядає таким чином:

procedure TForm2.Button1Click(Sender: TObject);
var
Text: TStringList;
Reg: TRegExp;
mc: MatchCollection;
m: Match;
sm: SubMatches;
i, j: Integer;
D: TDateTime;
begin
URLDownloadToFile(nil, PChar(Format(site,[Edit1.Text])), PChar
(ExtractFilePath(Application.ExeName) + “Text.txt”), 0, nil);
Text := TStringList.Create;
Text.LoadFromFile(ExtractFilePath(Application.ExeName) + “Text.txt”);
Reg := TRegExp.Create(Self);
try
Reg.Pattern :=Pattern;
Reg.IgnoreCase:=true;
Reg.Global:=true;
Reg.Multiline:=true;
mc:=Reg.Execute(Text.Text) as MatchCollection;
if mc.Count > 0 then
begin
m:=mc[0] as Match;
sm:=m.SubMatches as SubMatches;
for j := 0 to sm.Count – 1 do
begin
if length(VarToStr(sm[j])) > 0 then
begin
Label5.Caption := VarToStr(sm[j]);
D:=VarToDateTime(sm[j]); Label7.Caption: = IntToStr (DaysBetween (Now, D)) + “днів”;
end;
end;
end
else
begin label5.Caption: = “не визначена”; label7.Caption: = “не визначено”
end;
finally
m:=nil;
sm:=nil;
mc:=nil;
Reg.Free;
end;
end;

Для порядку, розберемо процедуру по частинах. Спочатку ми зберігаємо необхідну нам сторінку в текстовий файл:

URLDownloadToFile(nil, PChar(Format(site,[Edit1.Text])), PChar
(ExtractFilePath(Application.ExeName) + “Text.txt”), 0, nil);
Text := TStringList.Create;
Text.LoadFromFile(ExtractFilePath(Application.ExeName) + “Text.txt”);

Причому функція URLDownloadToFile міститься в модуля urlmon, який необхідно підключити в uses.


При завданні URL “а для завантажування я використовував константу:

site = “http://www.who.is/whois/%s”;

Далі починається робота безпосередньо з регулярними виразами:


1. Створюємо об’єкт TRegExp і задаємо йому властивості

Reg.Pattern :=Pattern;
Reg.IgnoreCase:=true;
Reg.Global:=true;
Reg.Multiline:=true;

Pattern – наше регулярне вираження. IgnoreCase – ігноруємо регістр символів при пошуку. Global – намагатися знайти всі можливі відповідності в рядку. Multiline – підтримувати багаторядковий режим.


2. Шукаємо все відповідності в тексті

mc:=Reg.Execute(Text.Text) as MatchCollection;

то є всі знайдені соответвуют в рядку Text.text, задані в Pattern, повертаємо до колекції MatchCollection.


Ну, і далі, якщо відповідність було знайдено (а в ідеалі воно повинне бути тільки одне), то переглядаємо колекцію субсответсвій, тобто тих частин рядки, які в Pattern позначені круглими дужками. Це і буде наша дата реєстрації домена.


3. Як тільки знайшли дату, визначаємо вік домену в днях, для цього використовуємо функцію DaysBetween з модуля DateUtils.


4. Видаємо інформацію користувачеві.


Робота програми завершена. Вид програми після завершення роботи представлений на малюнку:



Як бачите, мій блог ще зовсім маленький – всього 75 днів від народження


До речі, при тестуванні програми виявилося, що домен google.com всього на два дні молодше домену yandex.ru … а я чомусь завжди вважав, що google набагато старше нашого Яшки.


Ну, і на закінчення як завжди викладаю вже готове додаток, який ви можете використовувати в своїх потребах.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*