Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразовать локальную ссылку в абсолютную 
V
    Опции темы
Ibragim
Дата 21.1.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



День добрый. 
Есть абсолютный адрес web-страницы и ссылка (неизвестно какая - абсолютная, локальная) в этом документе.
Как их корректно "склеить"?

BaseUrl = 'http://www.mail.ru/faq/page1.htm';
Link = '../quest.asp';

Может кто решал подобную задачу и знает готовые компоненты, типа как TIdURI для работы с URL?
Если нет, подскажите алгоритм.
Вариантов довольно много возникает - ссылок несколько видов, плюс BaseUrl может быть видов 
http://www.mail.ru/faq/page1.htm?q=test
http://www.mail.ru/faq/?q=test
http://www.mail.ru/faq?q=test

и так далее





Это сообщение отредактировал(а) Ibragim - 21.1.2007, 14:18
PM MAIL   Вверх
W4FhLF
Дата 21.1.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Непонятно, что должно получиться на выходе из BaseUrl и Link

Ну тут регулярки я думаю будет удобно заюзатьsmile Что-то за последние сутки уже 3ья подобная темаsmile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ibragim
Дата 21.1.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



получаться должно приблизительно так

BaseUrl = 'http://www.site.com/page1.html'
Link = 'page2.htm'
Result:= 'http://www.site.com/page2.htm'


BaseUrl = 'http://www.site.com/demo/page1.html'
Link = './page2.htm'
Result:= 'http://www.site.com/page2.htm'

PS Тему создал после трех часов рысканья по форуму, что-то не нашел. Счас посмотрел все посты за последние сутки, снова нет. Кинь ссылкой, если не лень.
PM MAIL   Вверх
W4FhLF
Дата 21.1.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



А если:

BaseUrl = 'http://www.site.com/demo/page1.html'
Link = '../page2.htm'

то: http://www.site.com/demo/page2.html

?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ibragim
Дата 21.1.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



а вот хрен его знает...
по логике как раз 'http://www.site.com/page2.htm', поскольку две точки это выход на уровень вверх по иерархии документов.

В общем плане смотри какая задача. Вот я в опере навожу курсор на любую ссылку, и она мне показывает хинт на ПРАВИЛЬНУЮ абсолютную ссылку, без разницы как ссылка записана в документе. Хочу такое же smile 

Я скачиваю документ ht.get(), ищу href= и должен собрать ссылки, чтобы дальше запихать в ht.get и скачать уже документы по эти ссылкам. Собрать их не сложно, а вот алгоритма преобразования так и не нащупал. Може пойти почитать учебник по html какие ссылки бывают...
PM MAIL   Вверх
December
Дата 23.1.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 1
Всего: 57



Наиболее грамотный путь в этом случае:
1) разбить базовый урл на составляющие
2) определить абсолютность и относительность ссылки
3) в зависимости от пункта второго либо склеить урл с доменом и портом, либо компенсировать каждые .. базовыми каталогами
Регулярки здесь совсем не нужны smile
Попробуй вот таким простым алгоритмом, если не получится - вечером код выложу


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
December
Дата 23.1.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 1
Всего: 57



Собственно, вот... Функция не моя, дотошно не проверял, но работает исправно.
Код

function Combine(Base, APath: string): string;
var
  I, J, K: integer;

begin
J := Pos('://', Base);
if J > 0 then
  J := Pos('/', Copy(Base, J+3, Length(Base)-(J+2)))+J+2  {third slash}
else
  J := Pos('/', Base);
if J = 0 then
  begin
  Base := Base+'/';   {needs a slash}
  J := Length(Base);
  end
else if Base[Length(Base)] <> '/' then
  Base := Base + '/';
APath := Trim(APath);
if (APath <> '') and (APath[1] = '/') then
  Result := Copy(Base, 1, J) + Copy(APath, 2, Length(APath)-1)
else Result := Base+APath;
I := Pos('/../', Result);
while I > 0 do
  begin
  if I > J then
    begin
    K := I;
    while (I > 1) and (Result[I-1] <> '/') do
      Dec(I);
    if I <= 1 then Break;
    Delete(Result, I, K-I+4);  {remove cancelled directory and '/../'}
    end
  else
    Delete(Result, I+1, 3);    {remove '../' after host name}
  I := Pos('/../', Result);
  end;
I := Pos('/./', Result);
while I > 0 do
  begin
  Delete(Result, I+1, 2);
  I := Pos('/./', Result);
  end;
end;



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Ibragim
Дата 24.1.2007, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



О, большое спасибо! Эта явно покорректней, чем то что я накатал когда не дождался ответа!
PM MAIL   Вверх
Ibragim
Дата 26.1.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Вот накатал вроде еще более универсально, чем предлагал December. Може кому пригодится.

Код

function Combine2(Url, ShortLink: string): string;
var
  Base: string;
  URI: TIdURI;
begin
    if LeftStr(ShortLink, Length('http://')) = 'http://' then
    begin
      Result := ShortLink;
      Exit;
    end;

    URI := TIdURI.Create(Url);

    if (LeftStr(ShortLink, 1) = '/') then
    begin
      Result := 'http://' + URI.Host + ShortLink;
      Exit;
    end;

    if (LeftStr(ShortLink, 2) = './') then
    begin
      Result := 'http://' + URI.Host + URI.Path + Copy(ShortLink, 3, Length(ShortLink) - 2);
      Exit;
    end;

    if (LeftStr(ShortLink, 2) = '..') then
    begin
      Base := LeftStr(URI.Path, Length(URI.Path) - 1);
      Base := LeftStr(Base, LastDelimiter('/', Base));
      Result := 'http://' + URI.Host + Base + Copy(ShortLink, 4, Length(ShortLink) - 3);
      Exit;
    end;

    Result := 'http://' + URI.Host + URI.Path + ShortLink;
end;


PM MAIL   Вверх
December
Дата 26.1.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 1
Всего: 57



эээ
имхо этот вариант содержит некоторые недобработки smile
например:
./././test.html
../../../test.html


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Ibragim
Дата 26.1.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



да знаю smile 
Но такое бывает весьма нечасто, а Ваша не так клеила './' , или може я чего не такпонял? smile 

<добавлено позже>

Счас еще раз потестил - все гуд...   Наверно я где-то лажанул
Тогда мое почтение, вариант December'a лучше smile 
Вопрос закрыт smile 

Это сообщение отредактировал(а) Ibragim - 26.1.2007, 21:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1089 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.