На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Поиск IP адреса в строке , как?
    Всем Привет!

    Ести ли готовые решения как найти(вырезать) IP со строки?

    строка типа "текст1, текст2 192.168.5.17 текстN"

    Я понимаю что есть разные функции поиска текста в троке но может есть способ попроще, подскажите как реализовать с меньшим кол. телодвижений?
        Регулярными выражениями можно воспользоваться.
        Например такую можно попробовать:
        ExpandedWrap disabled
          /(\d{1,3}[.]?){4}/


        Добавлено
        ExpandedWrap disabled
          $str = "bla-bla-bla, bla-bla-bla 192.168.5.17bla-bla-bla";
          print preg_match_all("/(\d{1,3}[.]?){4}/", $str,$matches);
          var_dump(trim($matches[0][0]));

        Выведет 192.168.5.17
        Или так ещё можно:
        ExpandedWrap disabled
          /(\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3})/i
          Lumen как ему php поможет?

          Spirit скачай RegExpr.pas, подключи к проекту, если нужно получить Ip4 из текста, то глянь это:

          ExpandedWrap disabled
            procedure GetIPList(Str, RegStr: String; LB: TListBox);
            var RE: TRegExpr;
                Ulist: TStrings;
                i: Integer;
            begin
            RE:=TRegExpr.Create;
            Ulist:=TStringlist.Create;
             try
              RE.Expression:=RegStr;
              if ExecRegExpr(RegStr,Str) then
               if RE.Exec(Str) then begin
                 repeat
                   LB.Items.Add( RE.Match[0] );
                 until not RE.ExecNext;
              end;
             finally
              RE.Free;
              Ulist.Free;
             end;
            end;
             
            procedure TForm1.Button1Click(Sender: TObject);
            begin
             GetIPList('sdgfsdf 260.21.22.5 jkhjkhjkh 192.168.10.10 + 192.580.125.780 192.168.10.12 jdkfhsf 435353fdgtdgdfg 192.168.10.2', '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b', ListBox1);
            end;
          Сообщение отредактировано: antonn -
            Я просто пример работы привел. Что первое под руку попалось, на том и тестил.
              Я тоже обычно в пхп делаю отладку регулярок =)
              Единственное неудобство - для дельфи чаще использую posix регулярки, а в пхп помощнее есть pcre, иногда так хочется "поиск вперед" вставить и не лепить костыли...
              Сообщение отредактировано: antonn -
                Начиная с ХЕ в стандартной поставке идёт обертка над PCRE
                  Цитата Spirit @
                  Есть ли готовые решения как найти(вырезать) IP со строки?

                  Привет. Есть, я тут набросал по-быстрому!

                  Delphi - поиск IP-адресов в строке и вывод их в список, не используя регулярные выражения.

                  ExpandedWrap disabled
                    procedure TForm1.Button1Click(Sender: TObject);
                     
                    var
                     q,s:string; // наша строка в двух переменных
                     Massiv1:array of Integer; // временный массив №1
                     i:integer; // универсальный счетчик
                     nach,konec:integer; // позиции начала и конца IP-адреса
                     blok1,blok2,blok3,blok4:string; // блоки IP-адреса представленные строкой
                     blok1i,blok2i,blok3i,blok4i:integer; // блоки IP-адреса представленные числом
                     a:integer; b:string; // проверочные переменные
                     
                    begin
                     q:=Form1.Edit1.Text; // забираем строку
                     s:=q; // дублируем
                     Massiv1:=nil; // чистим массив
                     
                     i:=length(s); // делаем переменную неравную нулю
                     while i>0 do // ищем все позиции точек и записываем позиции в массив
                     begin
                      i:=pos('.',s); // ищем точку в строке
                      if i>0 then
                       begin
                        SetLength(Massiv1, Length(Massiv1)+1); // увеличить размер массива на 1
                        Massiv1[Length(Massiv1)-1]:=i; // присваиваем  последнему элементу массива номер позиции точки в строке
                        Delete(s,i,1); // удаляем эту точку из строки
                        Insert(',',s,i); // вставляем запятую вместо точки
                       end;
                     end;
                     
                     for i:=0 to Length(Massiv1)-1 do // перебор по одному элементов массива
                     begin //-----------------------------------------------------------цикл--------------------------------------------------------------
                     //=============================//
                     // Massiv1[ i ] - первая точка //
                     // Massiv1[i+1] - вторая точка //
                     // Massiv1[i+2] - третья точка //
                     //=============================//
                     if (Massiv1[ i ]<>null) and (Massiv1[i+1]<>null) and (Massiv1[i+2]<>null) then // три позиции подряд не должны быть пустые
                      if ((Massiv1[i+1]-Massiv1[ i ])>1) and ((Massiv1[i+1]-Massiv1[ i ])<5) and ((Massiv1[i+2]-Massiv1[i+1])>1) and ((Massiv1[i+2]-Massiv1[i+1])<5) then // расстояние между ними 2-4
                       begin //-----------------------------------------------------------условие---------------------------------------------------------
                        nach:=0;
                        konec:=0;
                     
                        //-------------ищем начало IP-------------
                        if q[Massiv1[i]-1] in ['0'..'9'] then // первый символ перед первой точкой от 0 до 9
                        begin
                         nach:=Massiv1[i]-1;
                         if q[Massiv1[i]-2] in ['0'..'9'] then // второй символ перед первой точкой от 0 до 9
                         begin
                          nach:=Massiv1[i]-2;
                          if q[Massiv1[i]-3] in ['1'..'2'] then  // третий символ перед первой точкой от 1 до 2
                          begin
                           nach:=Massiv1[i]-3;
                          end;
                         end;
                        end;
                     
                        //-------------ищем конец IP-------------
                        if q[Massiv1[i+2]+1] in ['1'..'9'] then  // первый символ  после последней точки от 1 до 9
                        begin
                         konec:=Massiv1[i+2]+1;
                         if q[Massiv1[i+2]+2] in ['0'..'9'] then // второй символ  после последней точки от 0 до 9
                         begin
                          konec:=Massiv1[i+2]+2;
                          if q[Massiv1[i+2]+3] in ['0'..'9'] then // тертий символ  после последней точки от 0 до 9
                          begin
                           konec:=Massiv1[i+2]+3;
                          end;
                         end;
                        end;
                     
                        //-------------1-й блок IP адреса-------------
                        blok1:=''; // обнуляем
                        blok1i:=256; // присваеиваем переменной значение вне диапазона 0-255
                        blok1:=copy(q,nach,Massiv1[i]-nach); // копируем 1-й блок IP-адреса из строки q
                        b:=blok1; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok1:=''; // каждый символ блока должен быть цифрой
                        if blok1<>'' then blok1i:=StrToInt(blok1); // переводим строку в число
                     
                        //-------------2-й блок IP адреса-------------
                        blok2:=''; // обнуляем
                        blok2i:=256; // присваеиваем переменной значение вне диапазона 0-255
                        blok2:=copy(q,Massiv1[i]+1,Massiv1[i+1]-Massiv1[i]-1); // копируем 2-й блок IP-адреса из строки q
                        b:=blok2; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok2:=''; // каждый символ блока должен быть цифрой
                        if blok2<>'' then blok2i:=StrToInt(blok2); // переводим строку в число
                     
                        //-------------3-й блок IP адреса-------------
                        blok3:=''; // обнуляем
                        blok3i:=256; // присваеиваем переменной значение вне диапазона 0-255
                        blok3:=copy(q,Massiv1[i+1]+1,Massiv1[i+2]-Massiv1[i+1]-1); // копируем 3-й блок IP-адреса из строки q
                        b:=blok3; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok3:=''; // каждый символ блока должен быть цифрой
                        if blok3<>'' then blok3i:=StrToInt(blok3); // переводим строку в число
                     
                        //-------------4-й блок IP адреса-------------
                        blok4:=''; // обнуляем
                        blok4i:=256; // присваеиваем переменной значение вне диапазона 0-255
                        blok4:=copy(q,Massiv1[i+2]+1,konec-Massiv1[i+2]); // копируем 4-й блок IP-адреса из строки q
                        b:=blok4; for a:=1 to length(b) do if b[a] in ['0'..'9'] then else blok4:=''; // каждый символ блока должен быть цифрой
                        if blok4<>'' then blok4i:=StrToInt(blok4); // переводим строку в число
                     
                        //-------------условие для вставки IP-адреса-------------    
                        if (q[nach]<>'') and (nach<>0) // начало IP-адреса не должно быть пустым
                        and (q[konec]<>'') and (konec<>0) // конец IP-адреса не должен быть пустым
                        and (blok1i>0) and (blok1i<256) // 1й блок должен быть от 1 до 255, так как IP-адрес не может начинаться с нуля
                        and (blok2i>=0) and (blok2i<256) // 2й блок должен быть от 0 до 255
                        and (blok3i>=0) and (blok3i<256) // 3й блок должен быть от 0 до 255
                        and (blok4i>0) and (blok4i<256) // 4й блок должен быть от 1 до 255, так как IP-адрес не может заканчиваться на ноль
                        then Form1.Memo1.Lines.Add(IntToStr(blok1i)+'.'+IntToStr(blok2i)+'.'+IntToStr(blok3i)+'.'+IntToStr(blok4i)); // выводим IP-адрес в список
                     
                       end; //-----------------------------------------------------------условие----------------------------------------------------------
                     end; //-----------------------------------------------------------цикл---------------------------------------------------------------
                    end;
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0312 ]   [ 16 queries used ]   [ Generated: 24.04.24, 10:08 GMT ]