Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2017, 05:20   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию Опять регулярные выражения

Есть HTML разметка "<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>"
В результате нужно получить в результате вектор с контентом [Новости, Вести, Двести].
Есть код, который работает
Код:
#include<iostream>
#include <string>
#include "regex"
#include "iterator"
#include "map" 
using namespace std;
int main()
{
	string htmlTemp="<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>";
    
	smatch res;
	string link="li";
	vector<string> myList;
	regex reg("<" + link + "\\s.>([^</"+link+"]*)</" + link + ">");
	while (regex_search(htmlTemp, res, reg))
	{
		string stroka = res[1].str();
		htmlTemp = res.suffix().str();
		myList.push_back(stroka);
	}
	for(int i=0;i<myList.size();i++)
	 cout<<myList[i] <<endl;
    return 0;    
}
Cледующий код некорректно работает, хотя по моему мнению должен, не понимаю почему???
В результате только последний элемент [Двести]
Код:
#include<iostream>
#include <string>
#include "regex"
#include "iterator"
#include "map" 
using namespace std;
int main()
{
	string htmlTemp="<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>";
    
	smatch res;
	string link="li";
	vector<string> myList;
	regex reg("<" + link + "\\s.*>([^</"+link+"]*)</" + link + ">");
	while (regex_search(htmlTemp, res, reg))
	{
		string stroka = res[1].str();
		htmlTemp = res.suffix().str();
		myList.push_back(stroka);
	}
	for(int i=0;i<myList.size();i++)
	 cout<<myList[i] <<endl;
    return 0;    
}
polin11 вне форума Ответить с цитированием
Старый 05.08.2017, 06:53   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Зачем пытаться засунуть в регулярку все три элемента? Если завтра будет их 4, то переписывать?
Идём, например, сюда:
https://regex101.com
забиваем следующее выражение:
Код:
<li\s\d*>(.*?)<\/li>
в test string копируем
Код:
<li 1>Новости</li><li 2>Вести</li><li 3>Двести</li>
и наблюдаем чего напарсилось. Должно выдаться три совпадения со строками. Подходит - регулярку копируем и переправляем под сишный синтаксис с вкраплением переменной link. Лучше отлаживать регулярки при помощи подобных ресурсов или какой оффлайн программы. Тут на форуме, кстати, не так давно кто-то продвигал свой сайт-обучалку регуляркам с построением схемы разбора.
pu4koff на форуме Ответить с цитированием
Старый 05.08.2017, 07:05   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Полностью согласен с вами, но я видимо задачу неполно сформулировал
HTML разметка может быть
Код:
<li class="myCSS">Новости</li><li name="myName">Вести</li><li id='myId1'>Двести</li>
По моему разумению выражение, должно ловить [Новости, Вести, Двести], но этого не происходит
Код:
regex reg("<li\\s.*>(.*?)</li>");

Последний раз редактировалось polin11; 05.08.2017 в 07:08.
polin11 вне форума Ответить с цитированием
Старый 05.08.2017, 07:08   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

ну, поправьте на такое:
Код:
<li.*?>(.*?)<\/li>
Вообще для нормального парсинга html лучше искать какую-то библиотеку, которая строит DOM и умеет XPath. Еще можно попробовать перевести html в xml и работать уже как с xml, но зависит от разметки страницы. Регулярки - ненадёжное решение, если парсинга много. Для плюсов я не знаю что есть из библиотек, гуглить нужно.

Последний раз редактировалось pu4koff; 05.08.2017 в 07:14.
pu4koff на форуме Ответить с цитированием
Старый 09.08.2017, 09:05   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

В новостях у вас не может быть html-списка (элементов <li>)?
Если может - то регулярка сломается.

Даже если вы завелосипедите (не регуляркой, т.к. невозможно), проверку что вести начинаются когда все теги <li> внутри новостей закроются - то проблемы будут если внутри новостей будет исходник html с этими тегами. Или что-то такое.

Совет использовать нормальный парсер - скорее всего правильный. Почитать про это можно тут например: Способы обработки XML в Qt — Stream, SAX, DOM
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения Fahman Общие вопросы Delphi 6 15.02.2014 08:35
Регулярные выражения Xcopy Общие вопросы по программированию, компьютерный форум 1 13.10.2013 01:27
регулярные выражения Dimarik PHP 10 09.12.2010 21:19
Регулярные выражения Dima_D Общие вопросы Delphi 0 11.08.2010 21:16
Регулярные выражения Marsik Помощь студентам 4 14.11.2009 14:13