конечно туповато такое спрашивать, однако мне нужна помощь ваша. вопрос. Как с помощью операторов Copy, Pos, Delete, Length сделать список из этого? Code: {"countries":[[19,"Австралия"],[20,"Австрия"],[5,"Азербайджан"],[21,"Албания"],[22,"Алжир"],[23,"Американское Самоа"],[24,"Ангилья"],[25,"Ангола"],[26,"Андорра"],[27,"Антигуа и Барбуда"],[28,"Аргентина"],[6,"Армения"],[29,"Аруба"],[30,"Афганистан"],[31,"Багамы"],[32,"Бангладеш"],[33,"Барбадос"],[34,"Бахрейн"],[3,"Беларусь"],[35,"Белиз"],[36,"Бельгия"],[37,"Бенин"],[38,"Бермуды"],[39,"Болгария"],[40,"Боливия"] RegExpr не предлогать))
Код (в коде думаю ты сам разберешься, а если не сможешь разобраться -> моя личка открыта): Code: procedure TForm1.FormCreate(Sender: TObject); var s:string; current_int, current_name:string; goroda:array [1..100] of string;//за назв. переменной не ругать :D begin s:='{"countries":[[19,"Австралия"],[20,"Австрия"],[5,"Азербайджан"],[21,"Албания"]'; delete(s, 1, 14); while 1<>2 do begin current_int:=copy(s, pos('[', s)+1, pos(',', s)-1-pos('[', s)); current_name:=copy(s, pos('"', s)+1, pos('"]', s)-1-pos('"', s)); goroda[strtoint(current_int)]:=current_name; if length(s)-pos('"]', s)=1 then begin break; end else begin delete(s, 1, 1+length(current_int)+2+length(current_name)+3); end; end; end;
при загрузке больших данных, вылетает с ошибкой is not valid integer value. я попробую сам разобраться. спасибо!
я могу и сам это сделать. друзей вк получилось разделить)) ну если тебе в лом помочь мне - ладно. я пойму, но наезжать то зачем?
Вот решение с помощью TStringList: Code: AnsiString sTemp = ""; TStringList* CountryList = new TStringList; sTemp = "{\"countries\":[[19,\"Австралия\"],[20,\"Австрия\"],[5,\"Азербайджан\"],[21,\"Албания\"],[22,\"Алжир\"],[23,\"Американское Самоа\"],[24,\"Ангилья\"],[25,\"Ангола\"],[26,\"Андорра\"],[27,\"Антигуа и Барбуда\"],[28,\"Аргентина\"],[6,\"Армения\"],[29,\"Аруба\"],[30,\"Афганистан\"],[31,\"Багамы\"],[32,\"Бангладеш\"],[33,\"Барбадос\"],[34,\"Бахрейн\"],[3,\"Беларусь\"],[35,\"Белиз\"],[36,\"Бельгия\"],[37,\"Бенин\"],[38,\"Бермуды\"],[39,\"Болгария\"],[40,\"Боливия\"]"; sTemp.Delete(1, sTemp.Pos("[")); // удаляем лишнее CountryList->Delimiter = ','; // указываем разделитель CountryList->DelimitedText = sTemp; // текст разбивается на строки, разделителем считаются кавычки и запятая for(int i=0; i < CountryList->Count; ++i) // перебираем все полученные строки if(CountryList->Strings[i].Pos("[") || CountryList->Strings[i].Pos("]")) // если в строке есть квадратные скобки, удаляем ее CountryList->Delete(i--); Memo1->Lines->AddStrings(CountryList); // выводим список в мемо Edit1->Text = CountryList->CommaText; // или в едит через запятую delete CountryList; Переписать с сиплюса на делфи не сложно.
Входящая строка в edit1.text: var temp : TStringList; res : tstringlist; tmp : string; I: Integer; begin temp := TStringList.Create; res := TStringList.Create; tmp := StringReplace(edit1.text, '{"countries":[[', '', [rfReplaceAll]); tmp := StringReplace(tmp, '[', '', [rfReplaceAll]); tmp := StringReplace(tmp, ']', '', [rfReplaceAll]); temp.commatext := tmp; i := 0; while i < temp.Count do begin res.Add(temp + '=' + temp[i+1]); i := i + 2; end; В результате res имеет такой вид: 19=Австралия 20=Австрия 5=Азербайджан 21=Албания 22=Алжир 23=Американское Самоа 24=Ангилья 25=Ангола 26=Андорра 27=Антигуа и Барбуда 28=Аргентина 6=Армения 29=Аруба 30=Афганистан 31=Багамы 32=Бангладеш 33=Барбадос 34=Бахрейн 3=Беларусь 35=Белиз 36=Бельгия 37=Бенин 38=Бермуды 39=Болгария 40=Боливия Тогда можно иметь такой доступ к номеру и стране: res.NAmes - номер res.ValueFromindex - страна Чтобы просто выводился список стран: while i < temp.Count do begin res.Add(temp[i+1]); i := i + 2; end;
PHP: function ParserBlock(var Page:string; const Param1,Param2:string):string; var BeginPos, EndPos:integer; begin BeginPos:=AnsiPos(Param1,Page)+length(Param1); delete(Page,1,beginPos-1); BeginPos:=AnsiPos(Param1,Page)+length(Param1); EndPos:=AnsiPos(Param2,Page); Result:=copy(page,1,EndPos-1); end; procedure TForm1.Button1Click(Sender: TObject); var s:string; begin s:=edit1.Text; Delete(s,1,pos('[',s)); while (length(s)>2) do begin Memo1.Lines.Add(ParserBlock(s,'[',',')+#09+ParserBlock(s,'"','"')); end; end;