(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Определение возраста домена. RegExp в Delphi 2010

Источник: webdelphi

Источник: webdelphi

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

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

1. Добавляем RegExp в Delphi 2010.

RegExp_import_2Прежде, чем начать программировать, необходимо добавить в 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". В итоге получаем страничку следующего содержания:

whois_webdelphi

Красным цветом выделена необходимая нам строка (рисунок кликабельный) - дата создания домена. Казалось бы все просто - нашел строку, вытащил дату и дело в шляпе. Но, если б все было так просто - был бы рай  Попробуйте теперь найти информацию, например по домену 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. Пишем приложение для определения возраста домена

Приложение наше будет считать возраст домена в днях и выглядеть довольно простенько:

prilogenie

Имя домена задается без 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. Выдаем информацию пользователю.

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

prilogenie2

Как видите, мой блог ещё совсем маленький - всего 75 дней от роду

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

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

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 25.01.2010 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
SAP Crystal Reports XI R2 Dev 2006 INTL WIN NUL License (Version 11)
ESET NOD32 Антивирус на 1 год для 3ПК или продление на 20 месяцев
Microsoft Windows Professional 10, Электронный ключ
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Утиль - лучший бесплатный софт для Windows
Delphi - проблемы и решения
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100