Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > pcrecpp


Автор: chubaka 13.3.2008, 20:45
Нужно получить все адреса рисунков на странице html, из тега <img src="">

заранее спасибо

 smile

Добавлено через 3 минуты и 37 секунд
Пример на pcre тоже не будет лишним.

Автор: chubaka 13.3.2008, 22:59
Найдено в доках, всем спасибо.

Код

  Example: read lines of the form "var = value" from a string.
     string contents = ...;                 // Fill string somehow
     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece

     string var;
     int value;
     pcrecpp::RE re("(\\w+) = (\\d+)\n");
     while (re.Consume(&input, &var, &value)) {
       ...;
     }

Автор: chubaka 14.3.2008, 02:14
Люди помогите пожалуйста правильно составить регулярное выражение, для получения адресов рисунков с HTML кода, т.е. с тегов <img src="адрес">

Автор: Mayk 14.3.2008, 09:15
Примерно так(только это RE вима, pcre под рукой нет):
Цитата

<\_s*img[^>]*src\_s*=\_s*"\([^"]*\)"

[то еcть ищем тэг <img, внутри которого ищем src="адрес", адрес заносится в первую группу ]
\_s в виме это пробельный символ включая перенос строки. в pcre должен быть аналог.


Автор: chubaka 14.3.2008, 15:53
Код
     std::string var;
     pcrecpp::RE re("<\_s*img[^>]*src\_s*=\_s*"\([^"]*\)");
     while (re.Consume(&input, &var)) {
       std::cout << var << std::endl;
     }


Дядька g++ ругается матом:

Цитата
main.cpp:184:21: warning: unknown escape sequence '\_'
main.cpp:184:21: warning: unknown escape sequence '\_'
main.cpp:184:21: warning: unknown escape sequence '\_'
main.cpp: In function `void parse_cookies(std::string)':
main.cpp:184: error: stray '\' in program
main.cpp:184: error: expected primary-expression before '[' token
main.cpp:184: error: expected primary-expression before '^' token
main.cpp:184:52: warning: unknown escape sequence '\)'
main.cpp:184: error: expected `]' before ')' token
main.cpp:184: error: `"<_s*img[^>]*src_s*=_s*"' cannot be used as a function

Автор: Mayk 14.3.2008, 16:12
Цитата(chubaka @  14.3.2008,  19:53 Найти цитируемый пост)

Дядька g++ ругается матом:

А то об не ругался. 
Во-первых \ и " надо экранировать, 
Во-вторых йа русским языком сказал что \_s в pcre скорее нет чем есть.

Добавлено через 1 минуту и 17 секунд
ах да и в pcre группировки задаюццо через () а не через\(\)

Автор: Rififi 14.3.2008, 18:27
chubaka, 
для c/c++ регэксп, скорее всего, будет такой:

Код

std::string rx = "<img\\s+src=\\\"(.*?)\\\".*?\\/>"

искомое - в первой группе

Автор: chubaka 14.3.2008, 19:27
Цитата(Rififi @ 14.3.2008,  18:27)
chubaka, 
для c/c++ регэксп, скорее всего, будет такой:

Код

std::string rx = "<img\\s+src=\\\"(.*?)\\\".*?\\/>"

искомое - в первой группе


Спасибо, работает! 

Но, выдает только 1 результат, тоесть находит первый и дальше не ищет. 

Автор: Rififi 14.3.2008, 20:26
Цитата
Но, выдает только 1 результат

тебе нужно сделать _глобальную_ замену

выдержка из документации:
[pre]
GlobalReplace is like Replace except that it replaces  all  occurrences
       of  the  pattern  in  the string with the rewrite. Replacements are not
       subject to re-matching. For example:

         string s = "yabba dabba doo";
         pcrecpp::RE("b+").GlobalReplace("d", &s);

       will leave "s" containing "yada dada doo". It  returns  the  number  of
       replacements made.
[/pre]

Автор: chubaka 14.3.2008, 20:29
Мне не замена нужна, а получить адреса. И помоему нужно чтото дописать в само рег. выражение, в конец и в начало.

Я работаю с функцией, которая эти вещи делает глобально, цыклом. 

Код

while (re.Compare(...))
{
..
}


Ну вообщем, вам и так спасибо, частично помогли =)

Автор: Rififi 14.3.2008, 20:53
chubaka, 
ага, попутал. почему-то подумалось именно про замену.
тогда смотри про приплюснутые обёртки в виде Consume и FindAndConsume

Автор: chubaka 14.3.2008, 21:30
Ясно. Сам не разобрался, буду ждать может кто поможет. Спасибо ;)

Автор: vadiml 14.3.2008, 23:07
если "<img.....>" ищет только одно вхождение, то для многих надо указать 1 и более:
"(<img.....>)+"
Возвращаться будет не скаляр (1 строка), а список (по строке для каждого вхождения), т.е. его лучше всего получать в цикле while() по строке на итерацию

если надо искать, например, от 1 до 10 ссылок, то надо писать
"(<img.....>){1,10}"

а + эквивалентен значению {1,}

PS откройте любую книгу по перлу, глава -- регулярные выражения, т.к. pcre -- это регулярные выражения перла,
Одной из лучших считается Том Кристиансен, Джон Орвант, Ларри Уолл. Программирование на Perl. http://www.infanata.org/2006/12/04/programmirovanie_na_perl_tom_kristiansen__dzhon_orvant__larri_uoll.html ( файл --  http://rapidshare.com/files/5964764/001563.rar.html )

Автор: chubaka 15.3.2008, 00:02
vadiml, огромное вам спасибо, это именно то что нужно. Если комуто понадобиться - код:

Код

     std::string contents = " some text <img src=\"1.jpg\" /> \n <img src=\"2.jpg\" /> \n <img src=\"3.jpg\" /> some text ";

     pcrecpp::StringPiece input(contents);    

     const char* pExression = "(<img\\s+src=\\\"(.*?)\\\".*?\\/>)+";
     std::string var, var2;
     pcrecpp::RE re(pExression);
     while (re.FindAndConsume(&input, &var, &var2))
     {
        std::cout << var2 << "\n"; // тут результат
     }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)