Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2014, 17:48
Eugene287 Eugene287 вне форума
Прохожий
 
Регистрация: 16.04.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Добрый день!
Имеется строка:
s2:='CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович';

необходимо разобрать строку по параметрам..Например: CN:='Иванов Иван Иванович';
Adress:= подстроке с параметром STREET

как это сделать?

вот пример моего кода:
Код:
try
  sl:=TStringList.Create;
    SplitText(s2, sL);
    for i := 0 to sl.Count - 1 do begin
          if pos('OID.2.5.4.12=',sl[i])<>0 then begin
          doljn:=sl[i];
          n:=length(doljn);
          doljn:=copy(doljn,16,n);
          end;
          if pos('OID.2.5.4.4=',sl[i])<>0 then begin
          familia:=sl[i];
          n:=length(familia);
          familia:=copy(familia,14,n);
          end;
          if pos('OID.2.5.4.41=',sl[i])<>0 then begin
          imia_otchestvo:=sl[i];
          n:=length(imia_otchestvo);
          imia_otchestvo:=copy(imia_otchestvo,15,n);;
          end;
    end;
          showmessage(Должность: '+doljn);
          showmessage('ФИО: '+familia+' '+imia_otchestvo);

  finally
    sL.Free;
  end;

Но тогда засада с адресом..как быть?

Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52.
Ответить с цитированием
  #2  
Старый 16.04.2014, 18:17
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Если количество параметров всегда одно и тоже, то можно просто циклом искать всё между очередной "=" и знаком "," записывая в массив

Код:
var
params = array[0..9] of string;
while not pos("=",str) <> 0 do
 begin
 p1 := pos('=',str);
 params[i] := copy(str, p1, pos(','str) - p1);
 i:=i+1;
 end;

Школьное решение.

А вообще надо присуммонить M.A.D.M.A.N'a с его плакатом "Используй RegExp!"

Последний раз редактировалось Uniq!, 16.04.2014 в 18:21.
Ответить с цитированием
  #3  
Старый 16.04.2014, 18:31
Eugene287 Eugene287 вне форума
Прохожий
 
Регистрация: 16.04.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Uniq!
Если количество параметров всегда одно и тоже, то можно просто циклом искать всё между очередной "=" и знаком "," записывая в массив

Код:
var
params = array[0..9] of string;
while not pos("=",str) <> 0 do
 begin
 p1 := pos('=',str);
 params[i] := copy(str, p1, pos(','str) - p1);
 i:=i+1;
 end;

Школьное решение.

А вообще надо присуммонить M.A.D.M.A.N'a с его плакатом "Используй RegExp!"

а если количество параметров меняется?!
Ответить с цитированием
  #4  
Старый 16.04.2014, 18:38
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Ну тогда я думаю стоит воспользоваться вторым советом:
Цитата:
Сообщение от Uniq!
"Используй RegExp!"
(С)
Ответить с цитированием
  #5  
Старый 16.04.2014, 18:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

ИСПОЛЬЗУЙ REGEXP!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось Admin, 17.04.2014 в 19:48.
Ответить с цитированием
  #6  
Старый 16.04.2014, 18:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Eugene287
Имеется строка:
s2:='CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович';
Что-то эта строка мне сильно напоминает distinguishedName или ADsPath из протокола LDAP. Если это так, то эта строка некорректна - запятые (и другие спецсимволы) в параметрах должны экранироваться символом '\', т.е. должно быть вот так:
'CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск\, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович'
Ответить с цитированием
  #7  
Старый 17.04.2014, 01:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Eugene287
...необходимо разобрать строку по параметрам..
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 s2: string;
 sl, sm: TStrings;
 i: integer;
 flg: boolean;
begin

 s2:= 'CN=Иванов Иван Иванович,' +
      ' OU=Моя компания, O=экземпляр,' +
      'STREET=г.Минск, ул.Ленина д.15 кв.45,' +
      ' L=test, ST=BPS, C=BY, OID.2.5.4.12=программист,' +
      ' OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович';

 flg:= true;
 sl:= TStringList.Create;
 sm:= TStringList.Create;
 sl.Delimiter:= ',';
 sl.DelimitedText:= s2;

 for i := 0 to sl.Count-1 do
  if (Pos('=', sl[i]) > 0) then
   begin
    if flg then
     begin
      s2:= sl[i] + ' ';
      flg:= false;
     end else
      begin
       sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
       s2:= sl[i] + ' ';
      end;
   end else s2:= s2 + sl[i] + ' ';
    sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));

 Memo1.Lines.Assign(sm);

 sl.Free;
 sm.Free;
end;

Последний раз редактировалось Alegun, 17.04.2014 в 08:48. Причина: исправление
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Eugene287 (17.04.2014)
  #8  
Старый 17.04.2014, 09:38
Eugene287 Eugene287 вне форума
Прохожий
 
Регистрация: 16.04.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Что-то эта строка мне сильно напоминает distinguishedName или ADsPath из протокола LDAP. Если это так, то эта строка некорректна - запятые (и другие спецсимволы) в параметрах должны экранироваться символом '\', т.е. должно быть вот так:
'CN=Иванов Иван Иванович, OU=Моя компания, O=экземпляр, STREET=г.Минск\, ул.Ленина д.15 кв.45, L=test, ST=BPS, C=BY, OID.2.5.4.12=программист, OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович'


нет..это строка из буфера,в котором записаны данные о сертификате эл.ключа для подписи документов.

спасибо большое!получилось!
вопрос закрыт!

Цитата:
Сообщение от Alegun
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 s2: string;
 sl, sm: TStrings;
 i: integer;
 flg: boolean;
begin

 s2:= 'CN=Иванов Иван Иванович,' +
      ' OU=Моя компания, O=экземпляр,' +
      'STREET=г.Минск, ул.Ленина д.15 кв.45,' +
      ' L=test, ST=BPS, C=BY, OID.2.5.4.12=программист,' +
      ' OID.2.5.4.4=Иванов, OID.2.5.4.41=BPS-Иван Иванович';

 flg:= true;
 sl:= TStringList.Create;
 sm:= TStringList.Create;
 sl.Delimiter:= ',';
 sl.DelimitedText:= s2;

 for i := 0 to sl.Count-1 do
  if (Pos('=', sl[i]) > 0) then
   begin
    if flg then
     begin
      s2:= sl[i] + ' ';
      flg:= false;
     end else
      begin
       sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
       s2:= sl[i] + ' ';
      end;
   end else s2:= s2 + sl[i] + ' ';
    sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));

 Memo1.Lines.Assign(sm);

 sl.Free;
 sm.Free;
end;


хорошо..в Memo1 пишет все данные..а как сделать,чтобы каждый параметр записывался в свою переменную?!
что-то не понимаю как это сделать..

Последний раз редактировалось M.A.D.M.A.N., 17.04.2014 в 10:52.
Ответить с цитированием
  #9  
Старый 17.04.2014, 15:04
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

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

Для начала
Код:
var
CN, OU, O, STREET, L, ST, C, OID_2_5_4_12,
OID_2_5_4_4, OID_2_5_4_41: string;
...
потом
Код:
{ Вариант I, на доверии }

// Вставить до sm.Free

      CN:= sm[0];
      OU:= sm[1];
      O:= sm[2];
      STREET:= sm[3];
      L:= sm[4];
      ST:= sm[5];
      C:= sm[6];
      OID_2_5_4_12:= sm[7];
      OID_2_5_4_4:= sm[8];
      OID_2_5_4_41:= sm[9];
Код:
{ Вариант II, с проверкой наличия нужной строки}

{в процедуре необходимо сделать это

...
 sm.Add(s2);  // sm.Add(Copy(s2, Pos('=', s2) + 1, Length(s2)));
... 

в двух местах}


for i := 0 to sm.Count-1 do
     begin
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'CN' then
      CN:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OU' then
      OU:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'O' then
      O:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'STREET' then
      STREET:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'L' then
      L:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'ST' then
      ST:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'C' then
      C:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.12' then
      OID_2_5_4_12:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.4' then
      OID_2_5_4_4:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
     if Copy(sm[i],1,Pos('=', sm[i]) - 1) = 'OID.2.5.4.41' then
      OID_2_5_4_41:= Copy(sm[i],Pos('=', sm[i]) + 1, Length(sm[i]));
 end;
но это дебилизм полный, и сразу наводит на мысли о здравии составителя. Если что, этот G-код не мой, возможно навеяло ветром
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter