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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2010, 00:49
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию Проблема с парсером

Проверял программу и наткнулся на следующее, если при парсенге мы знаем что нужное нам слово состоит из 5 символов, то это good, а если меньше или больше как тогда поступить?
Ниже приведён код парсера которым подилился со мной pesi
PHP код:
function PosSrc(ssString): String;
var
    
BEInteger;
begin
    B
:= Pos('SRC="'ss)+5;
    
E:= PosEx('"'ssB);
    
Result:= Copy(ssBE-B);
end
Ответить с цитированием
  #2  
Старый 21.08.2010, 01:32
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код:
 B:= Pos('SRC="', ss)+5;
Видимо вас 5 в этой строчке смутило:
Функция Pos возвратит позицию начала искомой строки SRC=", но поскольку вас интересует то что заключено в кавычки после этой строки, то там и добавляется длина SRC=" т.е. 5 символов, а уж какой длины слово между ковычками в коде не оговаривается.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 21.08.2010, 12:33
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

ну всё таки как узнать какой длинны слово в 'SRC="..."'
Ответить с цитированием
  #4  
Старый 21.08.2010, 13:04
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

E-B и будет длина слова.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 21.08.2010, 23:56
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

так E-B у меня тут стоит Result:= Copy(ss, B, E-B); или я что не понял?

Последний раз редактировалось bulldog, 22.08.2010 в 00:10.
Ответить с цитированием
  #6  
Старый 22.08.2010, 00:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Функция Copy возвращает строку длиной E-B, а длина строки будет E-B это число
Почуствуйте разницу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 22.08.2010, 12:22
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

B у меня 5 исмволов, а Е концовка, получается мне нада только убрать +5?
Ответить с цитированием
  #8  
Старый 22.08.2010, 16:21
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

А почему В равна 5?
Код:
function PosSrc(S: String): String;
const
  Scr = 'src="';
var
    B, E: Integer;
begin
    B:= Pos(Scr, S) +Length(Scr);  { ищим Scr в S и прибавляем длинну Scr }
    { функция PosEx идентична Pos но она может искать с указанной позиции  }
    E:= PosEx('"', S, B); { здесь ищем '"' в S. Третий параметр тобишь "B"
    указывает на то с какой позиции начать поиск, вот для чего мы прибавляли длинну Scr
    если бы мы этого не сделали то PosSrc вернула бы "src="}
    Result:= Copy(S, B, E-B);  { копируем:
    "S" это строка из которой копируем,
    "B" здесь равна 22,
    "E" равна 36.
    Тобишь "B" указывает с какой позиции копировать
    "E-B" сколько символов скопировать(от 36 отняли 22 получили 14)}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a: string;
begin
  a:= '<img id="login" src="newcaptcha.php" width="80" height="20"';
  memo1.Text:= PosSrc(a);
end;
Ответить с цитированием
  #9  
Старый 22.08.2010, 18:34
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

Я про то что мне заведомо неизвестна длина интересующей меня ссылки,
[]
a:= '<img id="login" src="newcaptcha.php" width="80" height="20"';
[/]
это капча и так понятно, но меня интересует именно то что ссылка может содержать от 4 до 9 мож и больше символов, вот и спрашиваю есть ли способ при парсенге канкретней узнать её длинну, что бы выцыпить
Ответить с цитированием
  #10  
Старый 22.08.2010, 18:46
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

А разве тут известно какой она длинны???
Ответить с цитированием
  #11  
Старый 22.08.2010, 18:51
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Не, ну блин такое впечатление, что общаются слепой с глухим, я уже не знаю как еще объяснить. Функия function PosSrc(ss: String): String; которую вы-же и давали возвращает ссылку независимо от ее длины. Функция ориентируется по ключевому слову src и кавычкам. Для примера:
Код:
a := PosSrc('<img id="login" src="newcaptcha.php" width="80" height="20"');
В а будет 'newcaptcha.php'
для такой строки:
Код:
a := PosSrc('<img id="login" src="123.php" width="80" height="20"');
В а будет '123.php'
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 23.08.2010, 18:59
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

И я про тоже, тем более что ссылку на капчу я в пример давал, вот что канкретно меня интересует
view.php?ad=3237
view.php?ad=37
view.php?ad=64237
view.php?ad=129
view.php?ad=1237
вот как мне это опредилить?При том что я ищу по маске view.php?ad=

Последний раз редактировалось bulldog, 23.08.2010 в 19:13.
Ответить с цитированием
  #13  
Старый 23.08.2010, 19:43
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Сначала разберись с Copy, Pos, PosEx, Delete, а потом дальше лезь
Ответить с цитированием
  #14  
Старый 23.08.2010, 20:11
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

До сих пор использую этот код, т.к. парсер не могу настроить
Код:
while Pos('view.php?ad=',str)>0 do begin
ListView1.Items[0].SubItems.Append(Copy(str,Pos('view.php?ad=',str)+12,7));
Delete(str,1, Pos('view.php?ad=',str)+12);
то есть мне тут не хватает PosEX, а куда его ставить то?
Ответить с цитированием
  #15  
Старый 23.08.2010, 20:51
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Немножко не так:
Код:
Copy(str,Pos('view.php?ad=',str)+12,7)
Вот эта функция у вас будет возвращать 7 символов всегда, хотя судя по вашим примерам у вас эта величина произвольная. Надо знать какой символ/символы идут после циферек, вычислять их положение и уже потом подставлять вместо семерки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter