Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа преобразования html документа, Как заменять ссылки? 
:(
    Опции темы
emaxiz
Дата 1.9.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



помогите, пожалуйста, написать программу которая бы осуществляла преобразование HTML документов; чтобы все абсолютные ссылки на документы и файлы изображений заменялись на относительные.
т.е. к примеру нам дан какой-нибудь html документ и нужно чтобы эта программа заменяла абсолютные ссылки на относительные и сохраняла его в другом файле. Например в этом html документе встретилось <a href="http://forum.vingrad.ru/images/avatars/1.gif">рис</a> и нужно чтоб она заменила на <a href="images/avatars/1.gif">рис</a>

можно ли осуществлять эту замену (удаление этого корня сайта) с помощью strstr?
PM MAIL   Вверх
cutwater
Дата 1.9.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А может проще скрипт на перле написать? там всего одна строчка выйдет...
А вообще можно сделать с помощью регулярных выражений, к примеру boost::regexp
Сейчас нет возможности код кинуть, сори.

Добавлено через 2 минуты и 43 секунды
Извините, по последнюю строчку не заметил.
В принципе можно, но strstr - это всего лишь поиск подстроки, вам придется написать собственную ф-цию.
И еще вопро, строка (корень сайта) фиксирована? или неизвестна?


--------------------
user posted image
PM MAIL   Вверх
emaxiz
Дата 2.9.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



корень сайта может быть любой. т.е. может быть любой сайт. мне нужно на с++
а какую функцию писать то? 
PM MAIL   Вверх
lc0d3r
Дата 2.9.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



можно сделать замену регулярками, я когда-то юзал ругулярки в либе pcre.. она сама не сильно тяжелая +хватает документации и примеров /*кстати синтаксиси да и сама либа перловая*/
PM MAIL WWW   Вверх
cutwater
Дата 2.9.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тоже вариант. Перловые регекспы самые мощные на мой взгляд


--------------------
user posted image
PM MAIL   Вверх
emaxiz
Дата 2.9.2008, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так надо все это не на Perl а на С++
PM MAIL   Вверх
cutwater
Дата 3.9.2008, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сказали же, библиотека pcre именно на С++, синтаксис регекспов перловый. Можете попробовать так же boost::regexp, хотя я лично не пользовался.


--------------------
user posted image
PM MAIL   Вверх
MastEdm
  Дата 3.9.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

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



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

Как вариант можно через strstr искать указатель на начало ссылки примерно так:
Код

const char* ptr = strstr(buf, "<a href=");
while(true) {
    if (ptr) {
        // обрабатываем линк
    } else {
        break;
    }
    ptr = strstr(ptr+1, "<a href="); // Тут проверить, не вылезаем ли за границу buf
}

Ну а новый код складывать в новый буфер. 

Это сообщение отредактировал(а) MastEdm - 3.9.2008, 21:39
PM MAIL   Вверх
jonie
Дата 3.9.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



MastEdm потому-что ваша штука не найдет такое, например:
Код

<a title="link" href="some">somelinke</a>

Хотя, конечно, парсить руками можно. и даже не очень сложно..

Это сообщение отредактировал(а) jonie - 3.9.2008, 22:47


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
emaxiz
Дата 4.9.2008, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а можно ли сделать чтоб все что до / (слеша) удалялось и 3 раза повторять цикл. т.е. чтобы все удалялось до 3 слеша. и получится что программа уберет этот корень сайта
PM MAIL   Вверх
Rickert
Дата 4.9.2008, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



std::string. find_first_of до третьей "/"
Я бы писал свой класс строки. Ну, всмысле он у меня конечно есть, но я бы добавил в неё такую функцию. Велосипедист - самокатчик я smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MastEdm
Дата 4.9.2008, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

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



jonie, ну это само собой. Можно тогда так:
Код

beg_a = strstr(buf, "<a ");
if (beg_a) {
    end_a = strchr(beg_a, '>');
    if (end_a)  {
        ptr_href = strstr(beg_a, "href=");
        if (ptr_href && ptr_href < end_a) {
            // обрабатываем линк
        }
    }
}

PM MAIL   Вверх
jonie
Дата 4.9.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



кстати, есть библиотека TidyLib для разбора html


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
emaxiz
Дата 4.9.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасиб! а если с конца начинать. чтоб до первого "/" с конца. и до http включительно. и чтобы теги оставались. это как можно сделать?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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