The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Извлечение строки между тегов"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Извлечение строки между тегов"  +/
Сообщение от Чтото затупливаю.. on 11-Сен-09, 14:29 
Здравствуйте!
Поискал на форуме, да не нашел.
Необходимо извлечь информацию, находящуюся между любыми двумя тегами.
Пример:
буфер="мусор...<tag>полезная_инфа</tag>снова_мусор..."
тег="tag"

Делаю функцию, которая принимает буфер и тэг, внутри сама обрамляет тэг символами <,> и / (для закрывающего). Все бы было тривиально, если бы после закрывающего тега не было мусора. Реализовал все, кроме, собственно, вытаскивания полезной инфы.
Делаюн а чистом Си, так что регулярные выражения не предлагать.
Интересует общий алгоритм сего извлечения.
Что-то типа
если символ буфера==символ закрывающего тега
смотрим и сравниваем следующий символ
иначе записываем данные в массив.

Еще проблема в том, что если таким образом проверять, некоторые данные могут просто не попасть в полезный массив.
К примеру в такой строке "garbage<tag>inside</tatags</tag>garbage"

Такая задача, имхо, в xml-парсерах лежит. Может кто знаком?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Извлечение строки между тегов"  +/
Сообщение от Pahanivo email(ok) on 11-Сен-09, 16:45 
>[оверквотинг удален]
>Что-то типа
>если символ буфера==символ закрывающего тега
> смотрим и сравниваем следующий символ
>иначе записываем данные в массив.
>
>Еще проблема в том, что если таким образом проверять, некоторые данные могут
>просто не попасть в полезный массив.
>К примеру в такой строке "garbage<tag>inside</tatags</tag>garbage"
>
>Такая задача, имхо, в xml-парсерах лежит. Может кто знаком?

я таки думать шо вы имеете заблуждаться
на перле это решается в одну строку ... регексами
да и под С можно заюзать теже PCRE

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Извлечение строки между тегов"  +/
Сообщение от Andrey Mitrofanov on 11-Сен-09, 16:51 
>я таки думать шо вы имеете заблуждаться

Препод не заблуждается. Он %) велел на си, значит на си

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Извлечение строки между тегов"  +/
Сообщение от опять я on 11-Сен-09, 19:15 
>>я таки думать шо вы имеете заблуждаться
>
>Препод не заблуждается. Он %) велел на си, значит на си

Зря вы так :)
Если есть чего по теме, прошу.
Суть в следующем - есть сервер на сокетах неблокируемых, на него приходят строки подобного рода, нужно их распарсить и пустить в обиход :) (строки приходят в таком псевдо-xml виде - типа <quote><mytag>тарампарампам</mytag></quote>)
Все сделал, кроме этого.
Не хочу подрубать лишние библиотеки, глядел в сторону expat, но думаю это ведь не должно быть сложно написать самому.
Система центос 5.3, вам версии компиля надо?:)
Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем программистская.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Извлечение строки между тегов"  +/
Сообщение от gaa (ok) on 11-Сен-09, 19:29 
>Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем
>программистская.

Нет тут алгоритмической задачи.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Извлечение строки между тегов"  +/
Сообщение от снова_я on 12-Сен-09, 07:36 
>>Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем
>>программистская.
>
>Нет тут алгоритмической задачи.

Как и помощи от вас ,)

Вообщем, накидал такой код
buffer - входной буфер с сокета
tag_start, tag_end - соответственно открывающийся и закрывающий теги

if((s1=strstr(buffer,tag_start))!=NULL && (s2=strstr(s1,tag_end))!=NULL)
    {
        pos=0;
        for(i=0,j=0;i<strlen(s1);i++)
        {
            if(s1[i]==tag_end[j])
            {
                n=pos=i;
                eq=1;
                do
                {
                    if(s1[n+1]==tag_end[j+1])
                    {
                        n++;
                        j++;
                    }
                    else
                    {
                        eq=0;
                        j=0;
                        break;
                    }
                } while(tag_end[j]!='\0');    
            }
            else
            {
                eq=0;
            }
        }
        printf("%d\n",pos);
    }
    else
    {
        printf("%s\n","Pattern not found or incorrect buffer string");
    }
Собственно, запоминаем позицию. затем в цикле считываем до нее и получаем переменную между тегов,

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Извлечение строки между тегов"  +/
Сообщение от phpcoder email(??) on 14-Сен-09, 06:26 
>[оверквотинг удален]
>      n++;
>      j++;
>     }
>     else
>     {
>      eq=0;
>      j=0;
>      break;
>     }
>    } while(tag_end[j]!='\0');

У меня смутное ощущение, что все эти строки можно заменить на вызов strncmp() или strcmp()

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Извлечение строки между тегов"  +/
Сообщение от niXman (ok) on 03-Окт-09, 02:05 
Так практичней будет.

#include <string>
#include <algorithm>

/***************************************************************************/

std::string get_text(const std::string& str) {
    const std::string open_tag("<tag>");
    const std::string close_tag("</tag>");

    std::string::const_iterator open = std::search(str.begin(), str.end(), open_tag.begin(), open_tag.end());
    std::string::const_iterator close= std::search(str.begin(), str.end(), close_tag.begin(), close_tag.end());
    
    if ( open == str.end() || close == str.end() ) {
        return std::string();
    }
    
    std::advance(open, open_tag.length());
    return std::string(open, close);
}

/***************************************************************************/

int main(int argc, const char** argv) {
    const std::string str("gkjeihgei<tag>needle text</tag>kjbsbv");
    
    std::string result = get_text(str);

    return 0;
}

/***************************************************************************/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Извлечение строки между тегов"  +/
Сообщение от Alex__S on 15-Сен-09, 04:07 

а в сторону lex-bison не смотрел?
там как-то вроде можно было извратиться, чтоб поток принимался
а если буфер разумной длины и гарантированно содержит открывающий и закрывающий тэги - тогда вообще без проблем

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Извлечение строки между тегов"  +/
Сообщение от Чтото затупливаю.. on 15-Сен-09, 06:07 
>
> а в сторону lex-bison не смотрел?
> там как-то вроде можно было извратиться, чтоб поток принимался
> а если буфер разумной длины и гарантированно содержит открывающий и закрывающий
>тэги - тогда вообще без проблем
>
>

Не-не, все делал без сторонних библиотек. Вообщем-то, работает как надо, еще чуток дополнить - и только фпуть!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру