Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.12.222] |
|
Сообщ.
#1
,
|
|
|
Всем Привет!
Ести ли готовые решения как найти(вырезать) IP со строки? строка типа "текст1, текст2 192.168.5.17 текстN" Я понимаю что есть разные функции поиска текста в троке но может есть способ попроще, подскажите как реализовать с меньшим кол. телодвижений? |
Сообщ.
#3
,
|
|
|
Регулярными выражениями можно воспользоваться.
Например такую можно попробовать: /(\d{1,3}[.]?){4}/ Добавлено $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 Или так ещё можно: /(\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3})/i |
Сообщ.
#4
,
|
|
|
Lumen как ему php поможет?
Spirit скачай RegExpr.pas, подключи к проекту, если нужно получить Ip4 из текста, то глянь это: 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; |
Сообщ.
#5
,
|
|
|
Я просто пример работы привел. Что первое под руку попалось, на том и тестил.
|
Сообщ.
#6
,
|
|
|
Я тоже обычно в пхп делаю отладку регулярок =)
Единственное неудобство - для дельфи чаще использую posix регулярки, а в пхп помощнее есть pcre, иногда так хочется "поиск вперед" вставить и не лепить костыли... |
Сообщ.
#7
,
|
|
|
Начиная с ХЕ в стандартной поставке идёт обертка над PCRE
|
Сообщ.
#8
,
|
|
|
Цитата Spirit @ Есть ли готовые решения как найти(вырезать) IP со строки? Привет. Есть, я тут набросал по-быстрому! Delphi - поиск IP-адресов в строке и вывод их в список, не используя регулярные выражения. 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; |