Прежде всего, я просто хочу сказать, что я понимаю, что использование HTML для регулярных выражений — плохая идея. Я просто использую это, чтобы схватить <img>
информация о тегах, так что мне плевать на вложенность и т. д.
Как говорится, я пытаюсь получить src
URL-адреса для всех изображений на веб-странице. Однако, похоже, я получаю только первый результат. Это мое регулярное выражение или то, как я его использую? Мои навыки регулярных выражений немного ржавые, поэтому я могу упустить что-то очевидное.
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" />
Что я хочу, но я знать на странице больше тегов изображений … есть идеи, почему я получаю только первое?
Обновить
С помощью Себастьяна Ланге я смог добиться этого:
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
в конце концов, это хакерский способ избавиться от элементов, не относящихся к src, в <img>
тег, так как похоже, что я не могу получить только данные внутри src="..."
сегмент. Это работает, но это только потому, что я не могу найти правильный способ сделать это работать. Я также добавил некоторые вещи, чтобы стандартизировать
Обычно QRegExp просто дает одно совпадение. Список capturedTexts () дает все захваты для этого одного матча! В одном выражении регулярного выражения может быть несколько скобок захвата. Чтобы решить вашу проблему, вам нужно сделать что-то вроде:
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
}
РЕДАКТИРОВАТЬ: изменил захват RegExpression на "\\<img[^\\>]*src=\"([^\"]*)\"[^\\>]*\\>"
EDIT2: добавлены возможные пробелы в строке src: "\\<img[^\\>]*src\\s*=\\s*\"([^\"]*)\"[^\\>]*\\>"
Других решений пока нет …