Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.04.2011, 22:31   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Парсинг квадратной скобки "["

Столкнулся с интересным явлением. Пишу небольшой парсер. И мне надо получить из строки
Код:
<a href="/forum/events/323/"><noindex>[03.04.2011] Название</noindex></a>
данные заключенные в квадратные скобки. Проблема в том, что поиск данного символа простым:
Код:
 x:=Pos('[',s);
ведет к зависанию программы. Но, в то же время если искать сначала:
Код:
x:=Pos('<noindex>',s);
а потом выводить следующий символ:
Код:
ShowMessage(s[x+9]);
то в сообщении скобка отображается правильно.
А если делать сравнение следующего символа:
Код:
if s[x+9]='[' then и дальше обработка
то опять идет зависание.

Прошу помощи, если кто сталкивался с подобным, либо знает решение проблемы.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума
Старый 12.04.2011, 22:51   #2
VadikV
Форумчанин
 
Аватар для VadikV
 
Регистрация: 08.01.2011
Сообщений: 226
По умолчанию

Так ты код покажи, приводящий к зависанию...
icq 223-630-454
e-mail vysotskiy@list.ru
сайт http://www.big-library.net/
VadikV вне форума
Старый 12.04.2011, 23:06   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Показываю:
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  ms:TmemoryStream;
  s:string;
  x:Integer;
begin
      ms:=TmemoryStream.create;
      idhtp1.Get('http://сайт.ru/forum/events/page1/',ms);
      ms.SaveToFile(extractfilepath(paramstr(0))+'1.html');
      ms.Free;
      mmo1.Lines.LoadFromFile(extractfilepath(paramstr(0))+'1.html');
      s:=mmo1.Text;
      mmo1.Text:=Utf8ToAnsi(s);
            x:=Pos('<noindex>',s);
            if s[x+9]='[' then ShowMessage('');
end;
я получаю исходную строку из интернета, но потом я ее перевожу в другую кодировку, чтобы русские символы читались:
Код:
s:=Utf8ToAnsi(s);
Если не переводить, то русских буковок нету, но и код все равно виснет.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума
Старый 12.04.2011, 23:25   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

эмм delphi7-2010 всё работает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  aMsg = '<a href="/forum/events/323/"><noindex>[03.04.2011] Название</noindex></a>';
var
  p: Integer;
  s: string;
  ResultS: string;
begin
  s := aMsg;
  p := AnsiPos('[', s);
  Delete(s, 1, Length(s) - p + 5);
  p := AnsiPos(']', s);
  Delete(s, p, Length(s));
  ShowMessage(S);
end;
Человек_Борща вне форума
Старый 12.04.2011, 23:29   #5
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Человек_Борща, когда идет явное присваивание строки как у тебя, то все работает. НО. Я получаю эту строку из интернета, что и написано в моем предыдущем посте.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума
Старый 12.04.2011, 23:36   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

хаха, тогда это что?
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  ms:TmemoryStream;
  s:string;
  x:Integer;
begin
      ms:=TmemoryStream.create;
      idhtp1.Get('http://сайт.ru/forum/events/page1/',ms);
      ms.SaveToFile(extractfilepath(paramstr(0))+'1.html');
      ms.Free;
      mmo1.Lines.LoadFromFile(extractfilepath(paramstr(0))+'1.html');
      s:=mmo1.Text;
?

Вы не правильно начали делать. И понятное дело, документ текстовый в пару метров, оно огого сколько pos'ом смотреть будет.
Обрезайте ненужное.

Последний раз редактировалось Человек_Борща; 12.04.2011 в 23:44.
Человек_Борща вне форума
Старый 12.04.2011, 23:47   #7
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Этот текстовый файл размером всего 40 кб. И парсится очень даже замечательно по разным тегам. А вот с символом "[" загвоздка. И только с ним.
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума
Старый 12.04.2011, 23:57   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

попробовал вот так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  aMsg='<a href="/forum/events/323/"><noindex>[03.04.2011] Название</noindex></a>';
var
  s:string;
  p:Integer;
  Ch:Char;
begin
  s:=aMsg;
  p:=Pos('<noindex>',s);
  Ch:=s[p+9];
  if Ch ='[' then ShowMessage(string(ch));
end;
Опять же всё работает.

Можно примерчик html файла?
Человек_Борща вне форума
Старый 13.04.2011, 00:48   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Ответил тебе в ЛС, а проблема вот где:
Код:
      while y<>0 do
        begin
          y:=Pos('<td class=title>',mmo1.Text);
          if y<>0 then
          begin
            s:=copy(mmo1.Text,0,y);
            x:=Pos('<noindex>',s);
            if s[x+9]='[' then ShowMessage('');
          end;
        end;
данный цикл стремится к бесконечности. Функция pos постоянно находит одну и туже строку(Позиция 105). Значит y никогда не будет равен 0.

Предлагаю зделать тебе так:
Нашёл строку, записал найденную позицию в список, удалил строку. Ищем снова. И так до конца файла. Потом переоткрываем файл и по сохранённым позициям прыгаем, и делаем что нам надо.

кстати, программа вешает процессор на 99+1% сразу понятно что не так=)

Последний раз редактировалось Человек_Борща; 13.04.2011 в 00:52.
Человек_Борща вне форума
Старый 13.04.2011, 09:05   #10
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

текст в TStringList и построчно ищем "[" скобу, я б так сделал
пыжок
maloun вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04