2013-07-17 2 views
0

Во-первых, я просто хочу сказать, что я понимаю, что использовать HTML-выражения для использования в качестве регулярных выражений. Я просто использую его, чтобы захватить информацию о тегах <img>, поэтому мне не важно, что вложенные и т. Д.QRegExp для HTML-тегов изображений

Это, как говорится, я пытаюсь получить URL-адреса src для всех изображений на веб-странице. Однако, похоже, я получаю только первый результат. Это мое регулярное выражение, или я его использую? Мои навыки регулярного выражения немного ржавые, поэтому я мог бы пропустить что-то очевидное.

QRegExp imgTagRegex("(<img.*>)+", Qt::CaseInsensitive); //Grab the entire <img> tag 
imgTagRegex.setMinimal(true); 
imgTagRegex.indexIn(pDocument); 
QStringList imgTagList = imgTagRegex.capturedTexts(); 
imgTagList.removeFirst(); //the first is always the total captured text 

foreach (QString imgTag, imgTagList) //now we want to get the source URL 
{ 
    QRegExp urlRegex("src=\"(.*)\"", Qt::CaseInsensitive); 
    urlRegex.setMinimal(true); 
    urlRegex.indexIn(imgTag); 
    QStringList resultList = urlRegex.capturedTexts(); 
    resultList.removeFirst(); 
    imageUrls.append(resultList.first()); 
} 

К тому времени, когда я попал в петлю foreach, то imgTagList содержит только 1 строку. Для «Кошек в Древнем Египте» Википедия страница, она содержит:

<img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/1/13/Egypte_louvre_058.jpg/220px-Egypte_louvre_058.jpg" width="220" height="407" class="thumbimage" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/1/13/Egypte_louvre_058.jpg/330px-Egypte_louvre_058.jpg 1.5x, //upload.wikimedia.org/wikipedia/commons/1/13/Egypte_louvre_058.jpg 2x" /> 

Что я хочу, но я знаю есть больше тегов изображений на странице ... любые идеи, почему я только получить первый назад?


Update

С помощью Себастьян Ланге, я был в состоянии получить это далеко:

QRegExp imgTagRegex("<img.*src=\"(.*)\".*>", Qt::CaseInsensitive); 
imgTagRegex.setMinimal(true); 
QStringList urlMatches; 
QStringList imgMatches; 
int offset = 0; 
while(offset >= 0) 
{ 
    offset = imgTagRegex.indexIn(pDocument, offset); 
    offset += imgTagRegex.matchedLength(); 

    QString imgTag = imgTagRegex.cap(0); 
    if (!imgTag.isEmpty()) 
     imgMatches.append(imgTag); // Should hold complete img tag 

    QString url = imgTagRegex.cap(1); 
    if (!url.isEmpty()) 
    { 
     url = url.split("\"").first(); //ehhh.... 
     if (!urlMatches.contains(url)) 
      urlMatches.append(url); // Should hold only src property 
    } 
} 

split в конце концов, это Hacky способ избавления от неправительственных -src в теге <img>, так как похоже, что я не могу получить только данные внутри сегмента src="...". Он работает, но это только потому, что я не могу правильно выбрать способ его работы. Я также добавил некоторые вещи, чтобы стандартизировать

ответ

1

QRegExp обычно просто дает одно совпадение. Список captureTexts() дает все захваты для этого совпадения! В одном выражении regex вы можете иметь несколько захватов. Для того, чтобы решить вашу проблему вам нужно будет сделать что-то вроде:

QRegExp imgTagRegex("\\<img[^\\>]*src\\s*=\\s*\"([^\"]*)\"[^\\>]*\\>", Qt::CaseInsensitive); 
imgTagRegex.setMinimal(true); 
QStringList urlmatches; 
QStringList imgmatches; 
int offset = 0; 
while((offset = imgTagRegex.indexIn(pDocument, offset)) != -1){ 
    offset += imgTagRegex.matchedLength(); 
    imgmatches.append(imgTagRegex.cap(0)); // Should hold complete img tag 
    urlmatches.append(imgTagRegex.cap(1)); // Should hold only src property 
} 

EDIT: изменил захват RegExpression к "\\<img[^\\>]*src=\"([^\"]*)\"[^\\>]*\\>" EDIT2: добавлены возможные пробелы в строке Src: "\\<img[^\\>]*src\\s*=\\s*\"([^\"]*)\"[^\\>]*\\>"

+0

Благодаря Себастьян, я дам этому попытку и возвращайся к тебе. –

+1

Я как бы забыл закрытие скобки, я отредактировал сообщение –

+0

Похоже, 'indexIn' возвращает' -1' при первом прохождении. –