Russian Qt Forum

Qt => Общие вопросы => Тема начата: kenny112 от Октябрь 23, 2009, 08:13



Название: И снова QRegExp
Отправлено: kenny112 от Октябрь 23, 2009, 08:13
Доброго времени суток :)
Я решил написать программу - грабер для страницы, то есть на вход я даю ссылку, а на выходе в папку сохраняются картинки с этой страницы.
И вот есть такой момент - разбор HTML на предмет ссылок на jpg, png, gif и т.д. файлы.
Подскажите как написать регулярное выражение, чтобы эти самые ссылки выдергивались. Вот например часть кода страницы
Цитировать
<td width="100%" align="center"><img src="modules/orehtNews/oktober2009/bbkproig.jpg" /></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">Проигрыватель BBK DVD DV318SI/ BBK DVD DV319SI/ BBK DVD DV412SI Караоке/ BBK DVD DV414SI Караоке/ BBK DVD DV610SI сер./ BBK DVD DV610SI черн./ BBK DVD DV611SI/ BBK DVD DV615SI/ BBK DVD DV625SI сер./ BBK DVD DV625SI черн./ BBK DVD DV627SI сер./ BBK DVD DV917HD сер. от 1426/1529/2719/2770/1847/1847/1919/1950/2001/2001/2021/2042 руб./шт.</p></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">&nbsp;</p></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">&nbsp;</p></td>   </tr>   <tr>      <td width="100%" align="center"><img src="modules/orehtNews/oktober2009/bbkmikr.jpg" /></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">Универсальный динамический микрофон BBK CM-115/ BBK CM-111 от 102/75 руб./шт.</p></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">&nbsp;</p></td>   </tr>   <tr background="modules/orehtNews/bg.gif">      <td width="100%" align="center"><p class="simple"><font color="#306246" size="+1"><b>САНТЕХНИЧЕСКИЕ ИЗДЕЛИЯ:</b></p></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">&nbsp;</p></td>   </tr>   <tr>      <td width="100%" align="center"><img src="modules/orehtNews/oktober2009/kollektor.jpg" /></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">Коллектор 3/4'', евроцанга, с 2-мя кранами, красный, латунь СК 093H (2 red)/с 2-мя кранами, синий, латунь CK 093H (2 blue)/с 3-мя кранами, красный, латунь CK 093H (3 red)/с 3-мя кранами, синий, латунь CK 093H (3 blue)/с 4-мя кранами, красный, латунь CK 093H (4 red)/с 4-мя кранами, синий, латунь CK 093H (4 blue)/с 5-ю кранами, красный ГР 453/с 5-ю кранами, синий ГР 453 от 239,8/239,8/324,7/324,7/414,7/414,7/447,2/447,2 руб./шт.</p></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">&nbsp;</p></td>   </tr>   <tr>      <td width="100%" align="center"><img src="modules/orehtNews/oktober2009/amerpryam.jpg" /></td>   </tr>   <tr>      <td width="100%" align="center"><p class="simple">Соединитель «американка» прямой, для П/С 1/2"х3/4",
тут например желательно выдернуть modules/orehtNews/oktober2009/bbkproig.jpg.
Ну и бывают страницы где ссылка представлена в полном формате http://path/*.jpg
Помогите пожалуйста, уже 3ий день бьюсь и никак не получается :-[


Название: Re: И снова QRegExp
Отправлено: _OLEGator_ от Октябрь 23, 2009, 13:12
Ну если в таком виде поставлен вопрос, что надо искать не только в теге <img>, но и в <tr background="modules/orehtNews/bg.gif">, то просто ищи по регулярному выражению "(.jpg | .png | .gif)" и от позиции вхождения влево и вправо ищи кавычки (одинарные и двойные по необходимости) и получится нужный текст.


Название: Re: И снова QRegExp
Отправлено: zenden от Октябрь 23, 2009, 13:17
Кавычек может и не быть :) В этом самая трудность (а также урезанные возможности кутешного регэкспа по сравнению с другими реализациями)... а если с кавычками, то такой регексп пишется за 5 секунд


Название: Re: И снова QRegExp
Отправлено: kenny112 от Октябрь 23, 2009, 13:27
Ну если в таком виде поставлен вопрос, что надо искать не только в теге <img>, но и в <tr background="modules/orehtNews/bg.gif">, то просто ищи по регулярному выражению "(.jpg | .png | .gif)" и от позиции вхождения влево и вправо ищи кавычки (одинарные и двойные по необходимости) и получится нужный текст.
Хм.. а как влево можно делать поиск?

to zenden  вот похоже мне с двойными кавычками подошло бы..

Цитировать
   QRegExp RX("(jpg|png|gif)");
   QString str;
   str=file->readAll();
   int pos=0;
   QStringList list;
   while((pos = RX.indexIn(str, pos)) != -1)
   {
      list<<RX.cap(0);
      qDebug()<<RX.cap(0);
      pos+=RX.matchedLength();
   }
   file->close();


Название: Re: И снова QRegExp
Отправлено: _OLEGator_ от Октябрь 23, 2009, 13:31
ищи с точкой: (.jpg | .png | .gif)
ну и без кавычек можно обойтись - слева ищешь =, а справа пробел или />


Название: Re: И снова QRegExp
Отправлено: zenden от Октябрь 23, 2009, 13:42
Цитировать
to zenden  вот похоже мне с двойными кавычками подошло бы..

Код
C++ (Qt)
QRegExp RX("\"([^\"]*\\.(gif|jpeg|jpg))\""); // или "[\"']([^\"']*\\.(gif|jpeg|jpg))[\"']"
RX.setMinimal(true);
RX.setCaseSensitivity(Qt::CaseInsensitive);
 
 


Название: Re: И снова QRegExp
Отправлено: kenny112 от Октябрь 23, 2009, 13:52
ищи с точкой: (.jpg | .png | .gif)
ну и без кавычек можно обойтись - слева ищешь =, а справа пробел или />
Вот я нашел позицию где стоит jpg png или gif, как организовать поиск влево с этой позиции? И можно ли задать так, чтобы Qregexp находил ближайшие кавычки к расширению?


Название: Re: И снова QRegExp
Отправлено: _OLEGator_ от Октябрь 23, 2009, 13:56
zenden написал выше - вроде работает как надо, проверь...


Название: Re: И снова QRegExp
Отправлено: kenny112 от Октябрь 23, 2009, 14:00
to _OLEGator_
Ага, не увидел :Dспасибо за помощь
to zenden
Спасибо большое, помогло :D :D