Вопросик по Си. Выборка значений из строки!
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Вопросик по Си. Выборка значений из строки! - 2008-10-20 04:26:55
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Доброе время суток) Возник вопрос по СИ! Каким кодом, можно наиболее быстро выбрать значения из нижележащей строки и записать в разные переменные. Надо выбрать значения: RED, ARIAL, ТЕКСТ. <font color='RED' face='ARIAL/MUSOR' size='5' musor='musor'><strong>ТЕКСТ</strong></font> Заранее спасибо за внимание…
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 06:06:29.090000
|
|
|
kreol
Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
|
Быстрее всего взять готовый html-парсер и распарсить строку с его помощью. http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=html-parser+C
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 07:30:44.513333
|
|
|
Безрукий Муструбатор
Сообщений: 22
Оценки: 0
Присоединился: 2008-10-15 09:44:12.703333
|
quote:
ORIGINAL: LungDesire Доброе время суток) Возник вопрос по СИ! Каким кодом, можно наиболее быстро выбрать значения из нижележащей строки и записать в разные переменные. Надо выбрать значения: RED, ARIAL, ТЕКСТ. <font color='RED' face='ARIAL/MUSOR' size='5' musor='musor'><strong>ТЕКСТ</strong></font> Заранее спасибо за внимание… Какие-то требования у тебя абсурдные.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 12:00:44.866666
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Извиняюсь за некчёмный пример строки, просто есть переменная, кот содержит много тупого кода, вроде того, что я указал. Важна производительнасть работы, лишние задержки неуместны. Потому и интерестны мнения др кодеров)
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 13:59:28.676666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Наиболее быстро - писать свой парсер. Тут такое соотношение - чем больше функционала - тем медленнее. Можешь тупо захардкодить, если у тебя гарантирован валидный синтаксис, т.е. если парсишь html - то он 100% правильный. Если же нет - то не стоит изобретать велосипед, а стоит делать, как сказал kreol.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:27:01.543333
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Я редактирую сорс проксика. Значит через него кидаются данные… К примеру, теже тэги. Осталось заредактировать его так, чтобы некие данные из этих тегов сохранялись. В perl'e я подобные вещи проворачивал используя маски поиска. Т.е. тупо резал необходимые значения, но в Си как это можно провернуть?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:29:11.560000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Скажу одно, html-парсер тут не прокатит )
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:34:20.860000
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
http://www.boost.org/doc/libs/release/libs/regex/ может это поможет.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 16:59:02.836666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Только хотел написать про регулярные выражения.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-20 22:04:26.376666
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
quote:
, но в Си как это можно провернуть? сначала получить вот такой массив строк
<font
color='RED'
face='ARIAL/MUSOR'
size='5'
musor='musor'>
<strong>
ТЕКСТ
</strong>
</font>
а потом уже обрабатывать их соответствующе (как видишь тут отбросив теги немного остаётся)
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 01:50:04.090000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Чел же написал, что у него не html… Тем более решение не универсальное. Как верно заметил орб - нужно курить регэкспы.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 04:58:31.566666
|
|
|
Безрукий Муструбатор
Сообщений: 22
Оценки: 0
Присоединился: 2008-10-15 09:44:12.703333
|
LungDesire, возьми sed на вооружение, кстати он на сях написан =) Ну а если нужно самому написать, то в чем дело? Попробуй хотябы посмотреть какие утилиты есть в libc http://www.gnu.org/software/libc/manual/ PS кстати, GNU славится открытыми исходниками
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 13:08:04.800000
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
quote:
Чел же написал, что у него не html не писал он, он написал что парсер не прокатит (может по причине того, что он не сможет его прикрутить) универсальное решение - разбор на лексемы
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-21 13:57:13.520000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
quote:
ORIGINAL: keys quote:
Чел же написал, что у него не html не писал он, он написал что парсер не прокатит (может по причине того, что он не сможет его прикрутить) универсальное решение - разбор на лексемы quote:
ORIGINAL: LungDesire Я редактирую сорс проксика. Значит через него кидаются данные… К примеру, теже тэги. Осталось заредактировать его так, чтобы некие данные из этих тегов сохранялись. В perl'e я подобные вещи проворачивал используя маски поиска. Т.е. тупо резал необходимые значения, но в Си как это можно провернуть?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 01:32:44.140000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Я щас пытаюсь решить задачу чер регулярные выражения… МОж что и прокатит…
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 01:41:51.583333
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
ты ему предлагаешь весь текст парсить, а зачем это надо? по-моему нужно выделить из всех данных html код и разложить его, а остальное добавлять по мере необходимости (ну я имею в виду другой код не html) updаtе: я представляю у него появляется java там и вместо того чтобы писать отдельную функцию для разложения java-кода он будет редактировать парсер
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-23 02:37:32.166666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
keys, у него не HTML, а исходный текст ПРОКСИ. На каком языке я хз, но точно не на HTML =)
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 00:24:22.963333
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
парни… в качестве примера строки я указал некое подобие того трафа, что чер прокси передаётся…. Что я и хочу, так это дописать сорс, дабы он ещё и анализировал значения… Например убедился, что в строке: <message from='popuskin@mail.ru/info' to='username@yandex.ru' xml:lang='ru' type='chat' id='25'><body>Да please </body></message>, есть действительно теги <message></message>. Далее выдирал значения из тега from, to, и собственно те строки, что содержаться между тэгов <body></body>. Осталось модифицировать сорс, он на Си написан. Т.к. всякого кода чер прокс будет летать полно, надо наиболее шустро организовать обработку и сохранение значений этих тегов.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 01:15:41.816666
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
quote:
Т.к. всякого кода чер прокс будет летать полно, надо наиболее шустро организовать обработку сначала определяешь какой код передаётся, а когда определил передаёшь соответствующей функции так можно для каждой строки делать (определить какой в ней код, html или этот), если html передать функции которая разберёт html и запишет значения в массив, если этот, передать функции которая разберёт этот и запишет все значения в массив (их потом можно перебирать и искать from to) поэтому в данном случае даже неважно какая там форма <message> или !message, т.к. каждая отдельная функция будет знать свою
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-24 03:53:12
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Это сложно. Кури MSXML парсер, или SHTML (кажись так). Руками всё равно !правильный! более шустрый не напишешь, если через прокси идёт любой html контент.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 00:20:04.473333
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Я пологаю обычный поиск тегов <message> позаолит убедиться в том, что строка должна анализироваться, а потом на крайняк через рег выражения вытащить всё… я могу сделать чтобы прокси писал всё в файл, а потом быстро написать скрипт на perl'e для анализа.. Это всё легко, но если скрипт накроется, т.е. вылетит по каким-нить причинам, то всему кердык, потому и хочу просто дописать сорс…
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 15:00:50.256666
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
с готовой строкой можно применить такое
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
#define MAXTEXT 5000
main()
{
char text[] = "<message from='popuskin@mail.ru/info'"
" to='username@yandex.ru' xml:lang='ru'"
" type='chat' id='25'><body>Да please"
"</body></message>";
char *mess_s = "<message";
char *mess_e = "</message>";
char *bod_s = "<body>";
char *bod_e = "</body>";
char line[MAXLINE], tags[MAXTEXT] = "", body[MAXTEXT] = "";
char *ps1, *pe1, *ps2, *pe2;
int offset, nc;
ps1 = strstr(text, mess_s);
pe1 = strstr(text, mess_e);
strncpy(tags, ps1+strlen(mess_s), pe1-(ps1+strlen(mess_s)));
ps2 = strstr(text, bod_s);
pe2 = strstr(text, bod_e);
strncpy(body, ps2+strlen(bod_s), pe2-(ps2+strlen(bod_s)));
*strstr(tags, bod_s) = '\0';
for (offset = 0; offset < strlen(tags); offset += nc) {
sscanf(tags+offset, "%s%n", line, &nc);
sscanf(line, "%*[^']%*[']%[^']", line);
printf("%s\n", line);
}
printf("%s\n", body);
return 0;
}
вывод
[guest@localhost tmp]$ ./test
popuskin@mail.ru/info
username@yandex.ru
ru
chat
25
Да please
[guest@localhost tmp]$
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 17:41:28.130000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Oooo… Это как раз то, что надо…. Респект тебе KEYS)))
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 18:09:01.750000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
А можно ли выводить только те значения, что лежат в тегах from и to, а не все? Пологаю, для этого достаточно просто поменять маску поиска —> sscanf(line, "%*[^']%*[']%[^']", line); ?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-25 18:27:42.510000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Вы не учитываете того, что .html может быть невалидный… Забудут где-нить закрыть тэг (>) - и ваш парсер обломается.
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 00:14:26.660000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
ну что мешает допустим поставить вместо <message —> message и в конце message> ? все покатит, или я ошибаюсь?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 00:34:01.153333
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
#define MAXTEXT 5000
main()
{
char text[] = "<message from='popuskin@mail.ru/info'"
" to='username@yandex.ru' xml:lang='ru'"
" type='chat' id='25'><bоdу>Да please"
"</bоdу></message>";
char *mess_s = "<message";
char *mess_e = "</message>";
char *bod_s = "<bоdу>";
char *bod_e = "</bоdу>";
char *filt1 = "from=";
char *filt2 = "to=";
char line[MAXLINE], tags[MAXTEXT] = "", bоdу[MAXTEXT] = "";
char *ps1, *pe1, *ps2, *pe2;
int offset, nc;
ps1 = strstr(text, mess_s);
pe1 = strstr(text, mess_e);
strncpy(tags, ps1+strlen(mess_s), pe1-(ps1+strlen(mess_s)));
ps2 = strstr(text, bod_s);
pe2 = strstr(text, bod_e);
strncpy(bоdу, ps2+strlen(bod_s), pe2-(ps2+strlen(bod_s)));
*strstr(tags, bod_s) = '\0';
for (offset = 0; offset < strlen(tags); offset += nc) {
sscanf(tags+offset, "%s%n", line, &nc);
if (strncmp(line, filt1, strlen(filt1)) == 0
|| strncmp(line, filt2, strlen(filt2)) == 0) {
sscanf(line, "%*[^']%*[']%[^']", line);
printf("%s\n", line);
}
}
printf("%s\n", bоdу);
return 0;
}
quote:
Вы не учитываете того, что .html может быть невалидный… Забудут где-нить закрыть тэг (>) забыть могут внутри <bоdу> </bоdу>, могут в почту поставить <message> и остальные а для html'а так если там забыли закрыть тег, значит его там нет ;) ну то есть и выдать сообщение что один тег оказался незакрытым тут поиск идёт только полных тегов "<message" это для "<message from=…" и для "<message>"
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 02:09:39.986666
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
что касается поиска в body, то изначальный поиск можно сделать тоже по char *bod_s = "bоdу>"; и до char *bod_e = "</bоdу"; , даже если начальный или конечный тег отрубят по глюку…
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 02:14:34.980000
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
char *bod_s = "bоdу>"; это создаёт неопределённую ситуацию, он так найдёт <bоdу>, </bоdу>, а надо чтобы bod_s находил (bоdу_start) то есть точно <bоdу, если у тебя bоdу без параметров, то он идёт целиком quote:
Забудут где-нить закрыть тэг (>) недописанный тег == его отсутствие, <message читается в любом случае дописан он или нет
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 18:32:31.126666
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
с этим ясно… а что касается того, чтобы выборка происходила не из всех тегов: popuskin@mail.ru/info username@yandex.ru ru chat 25 Да please , а только из конкретных: from - popuskin@mail.ru/info to - username@yandex.ru body - Да please как этого добиться в твоём сорсе Keys?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 20:45:32.286666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Написать свой, с использованием регулярных выражений?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-26 21:00:57.323333
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
У меня проблемы с синтаксисом :-/ Возможно уместно это сюда прикрутить? CString str; int startindex = str.Find(_T("color='")); CString rest = str.Mid(startindex, str.getLength()); int endIndex = rest.Find(_T("'")); CString color = rest.Mid(0, endIndex); Только у меня ошибок тонны кажутся… при компилинге… МОж кто посоветует, как наиболее грамотно прикрутить этот код к сорсу?
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-27 11:29:23.853333
|
|
|
keys
Сообщений: 137
Оценки: 0
Присоединился: 2008-08-06 08:48:50.340000
|
quote:
с этим ясно… а что касается того, чтобы выборка происходила не из всех тегов: я ж те написал, второй исходник
|
|
|
RE: Вопросик по Си. Выборка значений из строки! - 2008-10-27 21:37:25.960000
|
|
|
LungDesire
Сообщений: 24
Оценки: 0
Присоединился: 2008-09-06 20:47:36.733333
|
Sorry) Даже незаметил… Буду втыкать)))
|
|
|
|
|