<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Извлечение строки между тегов</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html</link>
    <description>Здравствуйте!&lt;br&gt;Поискал на форуме, да не нашел.&lt;br&gt;Необходимо извлечь информацию, находящуюся между любыми двумя тегами.&lt;br&gt;Пример: &lt;br&gt;буфер=&quot;мусор...&amp;lt;tag&amp;gt;полезная_инфа&amp;lt;/tag&amp;gt;снова_мусор...&quot;&lt;br&gt;тег=&quot;tag&quot;&lt;br&gt;&lt;br&gt;Делаю функцию, которая принимает буфер и тэг, внутри сама обрамляет тэг символами &amp;lt;,&amp;gt; и / (для закрывающего). Все бы было тривиально, если бы после закрывающего тега не было мусора. Реализовал все, кроме, собственно, вытаскивания полезной инфы.&lt;br&gt;Делаюн а чистом Си, так что регулярные выражения не предлагать.&lt;br&gt;Интересует общий алгоритм сего извлечения.&lt;br&gt;Что-то типа&lt;br&gt;если символ буфера==символ закрывающего тега&lt;br&gt; смотрим и сравниваем следующий символ&lt;br&gt;иначе записываем данные в массив.&lt;br&gt;&lt;br&gt;Еще проблема в том, что если таким образом проверять, некоторые данные могут просто не попасть в полезный массив.&lt;br&gt;К примеру в такой строке &quot;garbage&amp;lt;tag&amp;gt;inside&amp;lt;/tatags&amp;lt;/tag&amp;gt;garbage&quot;&lt;br&gt;&lt;br&gt;Такая задача, имхо, в xml-парсерах лежит. Может кто знаком?&lt;br&gt;</description>

<item>
    <title>Извлечение строки между тегов (niXman)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#9</link>
    <pubDate>Fri, 02 Oct 2009 22:05:13 GMT</pubDate>
    <description>Так практичней будет.&lt;br&gt;&lt;br&gt;#include &amp;lt;string&amp;gt;&lt;br&gt;#include &amp;lt;algorithm&amp;gt;&lt;br&gt;&lt;br&gt;/***************************************************************************/&lt;br&gt;&lt;br&gt;std::string get_text(const std::string&amp; str) &#123;&lt;br&gt;const std::string open_tag(&quot;&amp;lt;tag&amp;gt;&quot;);&lt;br&gt;const std::string close_tag(&quot;&amp;lt;/tag&amp;gt;&quot;);&lt;br&gt;&lt;br&gt;std::string::const_iterator open = std::search(str.begin(), str.end(), open_tag.begin(), open_tag.end());&lt;br&gt;std::string::const_iterator close= std::search(str.begin(), str.end(), close_tag.begin(), close_tag.end());&lt;br&gt;&lt;br&gt;if ( open == str.end() &amp;#124;&amp;#124; close == str.end() ) &#123;&lt;br&gt;return std::string();&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;std::advance(open, open_tag.length());&lt;br&gt;return std::string(open, close);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;/***************************************************************************/&lt;br&gt;&lt;br&gt;int main(int argc, const char** argv) &#123;&lt;br&gt;const std::string str(&quot;gkjeihgei&amp;lt;tag&amp;gt;needle text&amp;lt;/tag&amp;gt;kjbsbv&quot;);&lt;br&gt;&lt;br&gt;std::string result = get_text(str);&lt;br&gt;&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;/***************************************************************************/&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (Чтото затупливаю..)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#8</link>
    <pubDate>Tue, 15 Sep 2009 02:07:40 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt; а в сторону lex-bison не смотрел? &lt;br&gt;&amp;gt; там как-то вроде можно было извратиться, чтоб поток принимался &lt;br&gt;&amp;gt; а если буфер разумной длины и гарантированно содержит открывающий и закрывающий &lt;br&gt;&amp;gt;тэги - тогда вообще без проблем &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&lt;br&gt;Не-не, все делал без сторонних библиотек. Вообщем-то, работает как надо, еще чуток дополнить - и только фпуть!&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (Alex__S)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#7</link>
    <pubDate>Tue, 15 Sep 2009 00:07:33 GMT</pubDate>
    <description>&lt;br&gt; а в сторону lex-bison не смотрел?&lt;br&gt; там как-то вроде можно было извратиться, чтоб поток принимался &lt;br&gt; а если буфер разумной длины и гарантированно содержит открывающий и закрывающий тэги - тогда вообще без проблем&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (phpcoder)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#6</link>
    <pubDate>Mon, 14 Sep 2009 02:26:38 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;      n++; &lt;br&gt;&amp;gt;      j++; &lt;br&gt;&amp;gt;     &#125; &lt;br&gt;&amp;gt;     else &lt;br&gt;&amp;gt;     &#123; &lt;br&gt;&amp;gt;      eq=0; &lt;br&gt;&amp;gt;      j=0; &lt;br&gt;&amp;gt;      break; &lt;br&gt;&amp;gt;     &#125; &lt;br&gt;&amp;gt;    &#125; while(tag_end&#091;j&#093;!=&apos;&#092;0&apos;); &lt;br&gt;&lt;br&gt;У меня смутное ощущение, что все эти строки можно заменить на вызов strncmp() или strcmp()&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (снова_я)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#5</link>
    <pubDate>Sat, 12 Sep 2009 03:36:40 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем &lt;br&gt;&amp;gt;&amp;gt;программистская. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Нет тут алгоритмической задачи. &lt;br&gt;&lt;br&gt;Как и помощи от вас ,)&lt;br&gt;&lt;br&gt;Вообщем, накидал такой код&lt;br&gt;buffer - входной буфер с сокета&lt;br&gt;tag_start, tag_end - соответственно открывающийся и закрывающий теги&lt;br&gt;&lt;br&gt;if((s1=strstr(buffer,tag_start))!=NULL &amp;&amp; (s2=strstr(s1,tag_end))!=NULL)&lt;br&gt;&#123;&lt;br&gt;pos=0;&lt;br&gt;for(i=0,j=0;i&amp;lt;strlen(s1);i++)&lt;br&gt;&#123;&lt;br&gt;if(s1&#091;i&#093;==tag_end&#091;j&#093;)&lt;br&gt;&#123;&lt;br&gt;n=pos=i;&lt;br&gt;eq=1;&lt;br&gt;do&lt;br&gt;&#123;&lt;br&gt;if(s1&#091;n+1&#093;==tag_end&#091;j+1&#093;)&lt;br&gt;&#123;&lt;br&gt;n++;&lt;br&gt;j++;&lt;br&gt;&#125;&lt;br&gt;else&lt;br&gt;&#123;&lt;br&gt;eq=0;&lt;br&gt;j=0;&lt;br&gt;break;&lt;br&gt;&#125;&lt;br&gt;&#125; while(tag_end&#091;j&#093;!=&apos;&#092;0&apos;);&lt;br&gt;&#125;&lt;br&gt;else&lt;br&gt;&#123;&lt;br&gt;eq=0;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;printf(&quot;&#037;d&#092;n&quot;,pos);&lt;br&gt;&#125;&lt;br&gt;else&lt;br&gt;&#123;&lt;br&gt;printf(&quot;&#037;s&#092;n&quot;,&quot;Pattern not found or incorrect buffer string&quot;);&lt;br&gt;&#125;&lt;br&gt;Собственно, запоминаем позицию. затем в цикле считываем до нее и получаем переменную между тегов,&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (gaa)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#4</link>
    <pubDate>Fri, 11 Sep 2009 15:29:17 GMT</pubDate>
    <description>&amp;gt;Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем &lt;br&gt;&amp;gt;программистская. &lt;br&gt;&lt;br&gt;Нет тут алгоритмической задачи.&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (опять я)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#3</link>
    <pubDate>Fri, 11 Sep 2009 15:15:35 GMT</pubDate>
    <description>&amp;gt;&amp;gt;я таки думать шо вы имеете заблуждаться &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Препод не заблуждается. Он &#037;) велел на си, значит на си &lt;br&gt;&lt;br&gt;Зря вы так :)&lt;br&gt;Если есть чего по теме, прошу.&lt;br&gt;Суть в следующем - есть сервер на сокетах неблокируемых, на него приходят строки подобного рода, нужно их распарсить и пустить в обиход :) (строки приходят в таком псевдо-xml виде - типа &amp;lt;quote&amp;gt;&amp;lt;mytag&amp;gt;тарампарампам&amp;lt;/mytag&amp;gt;&amp;lt;/quote&amp;gt;)&lt;br&gt;Все сделал, кроме этого.&lt;br&gt;Не хочу подрубать лишние библиотеки, глядел в сторону expat, но думаю это ведь не должно быть сложно написать самому.&lt;br&gt;Система центос 5.3, вам версии компиля надо?:)&lt;br&gt;Просто я не лютый си-программер, хотя здесь чисто скорее алгоритмическая задачи, чем программистская.&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (Andrey Mitrofanov)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#2</link>
    <pubDate>Fri, 11 Sep 2009 12:51:29 GMT</pubDate>
    <description>&amp;gt;я таки думать шо вы имеете заблуждаться &lt;br&gt;&lt;br&gt;Препод не заблуждается. Он &#037;) велел на си, значит на си&lt;br&gt;</description>
</item>

<item>
    <title>Извлечение строки между тегов (Pahanivo)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8430.html#1</link>
    <pubDate>Fri, 11 Sep 2009 12:45:24 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;Что-то типа &lt;br&gt;&amp;gt;если символ буфера==символ закрывающего тега &lt;br&gt;&amp;gt; смотрим и сравниваем следующий символ &lt;br&gt;&amp;gt;иначе записываем данные в массив. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Еще проблема в том, что если таким образом проверять, некоторые данные могут &lt;br&gt;&amp;gt;просто не попасть в полезный массив. &lt;br&gt;&amp;gt;К примеру в такой строке &quot;garbage&amp;lt;tag&amp;gt;inside&amp;lt;/tatags&amp;lt;/tag&amp;gt;garbage&quot;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Такая задача, имхо, в xml-парсерах лежит. Может кто знаком? &lt;br&gt;&lt;br&gt;я таки думать шо вы имеете заблуждаться&lt;br&gt;на перле это решается в одну строку ... регексами&lt;br&gt;да и под С можно заюзать теже PCRE&lt;br&gt;</description>
</item>

</channel>
</rss>
