Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pcrecpp, поиск всех элементов удовл-их рег. выр-ю 
V
    Опции темы
chubaka
Дата 13.3.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

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

 smile

Добавлено через 3 минуты и 37 секунд
Пример на pcre тоже не будет лишним.
PM MAIL   Вверх
chubaka
Дата 13.3.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Найдено в доках, всем спасибо.

Код

  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)) {
       ...;
     }

PM MAIL   Вверх
chubaka
Дата 14.3.2008, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Люди помогите пожалуйста правильно составить регулярное выражение, для получения адресов рисунков с HTML кода, т.е. с тегов <img src="адрес">
PM MAIL   Вверх
Mayk
Дата 14.3.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

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

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



Это сообщение отредактировал(а) Mayk - 14.3.2008, 09:15


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
chubaka
Дата 14.3.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Код
     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


Это сообщение отредактировал(а) chubaka - 14.3.2008, 15:59
PM MAIL   Вверх
Mayk
Дата 14.3.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

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

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

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Rififi
Дата 14.3.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



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

Код

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

искомое - в первой группе
PM MAIL   Вверх
chubaka
Дата 14.3.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

Код

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

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


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

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

Это сообщение отредактировал(а) chubaka - 14.3.2008, 19:38
PM MAIL   Вверх
Rififi
Дата 14.3.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата
Но, выдает только 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]
PM MAIL   Вверх
chubaka
Дата 14.3.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

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

Код

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


Ну вообщем, вам и так спасибо, частично помогли =)
PM MAIL   Вверх
Rififi
Дата 14.3.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



chubaka, 
ага, попутал. почему-то подумалось именно про замену.
тогда смотри про приплюснутые обёртки в виде Consume и FindAndConsume
PM MAIL   Вверх
chubaka
Дата 14.3.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Ясно. Сам не разобрался, буду ждать может кто поможет. Спасибо ;)
PM MAIL   Вверх
vadiml
Дата 14.3.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 2
Всего: 7



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

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

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

PS откройте любую книгу по перлу, глава -- регулярные выражения, т.к. pcre -- это регулярные выражения перла,
Одной из лучших считается Том Кристиансен, Джон Орвант, Ларри Уолл. Программирование на Perl. http://www.infanata.org/2006/12/04/program...larri_uoll.html ( файл --  http://rapidshare.com/files/5964764/001563.rar.html )
PM MAIL Jabber   Вверх
chubaka
Дата 15.3.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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"; // тут результат
     }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.