2013-02-06 4 views
0

Я пытаюсь получить общую продолжительность плейлиста youtube с использованием данных youtube api. Я загружаю ответ от, например, http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958, и моя идея состоит в том, чтобы перебирать каждый из <yt:duration='xxx'/> событий, где xxx - это продолжительность видео в секундах и суммировать их, чтобы получить общее время воспроизведения плейлиста.Совпадение нескольких групп с CAtlRegExp

Для получения каждого я использовать CAtlRegExp со следующей строкой:

<yt:duration seconds='{[0-9]+}'/>

однако это соответствует только первое вхождение, а не какой-либо из остальных (со ссылкой на исходный код вставленного ниже, только итерации цикла один раз).

Я пробовал некоторые другие строки регулярных выражений, как

  • (<yt:duration seconds='{[0-9]+}'/>)

  • (<yt:duration seconds='{[0-9]+}'/>)*

однако они не работают либо (по той же причине).

Вот отрывок из исходного кода, где только для цикла итерацию один раз, потому что mcDuration.m_uNumGroups равна 1:

//get video duration 
    CAtlRegExp<> reDurationFinder; 
    CAtlREMatchContext<> mcDuration; 

    REParseError status = reDurationFinder.Parse(_T("<yt:duration seconds='{[0-9]+}'/>")); 

    if (status != REPARSE_ERROR_OK) 
    { 
     // Unexpected error. 
     return false; 
    } 

    if (!reDurationFinder.Match(sFeed, &mcDuration)) //i checked it with debug, sFeed contains full response from youtube data api 
    { 
     //cannot find video url 
     return false; 
    } 

    m_nLengthInSeconds = 0; 
    for (UINT nGroupIndex = 0; nGroupIndex < mcDuration.m_uNumGroups; ++nGroupIndex) 
    { 
     const CAtlREMatchContext<>::RECHAR* szStart = 0; 
     const CAtlREMatchContext<>::RECHAR* szEnd = 0; 
     mcDuration.GetMatch(nGroupIndex, &szStart, &szEnd); 

     ptrdiff_t nLength = szEnd - szStart; 
     m_nLengthInSeconds += _ttoi(CString(szStart, nLength)); 
    } 

Как я могу сделать CAtlRegExp матч все из вхождений <yt:duration ...?

ответ

1

У вас всегда будет первое (следующее) событие. Чтобы найти других, вы должны поддерживать Match 'ing в цикле, пока не будет найдено больше случаев.

for(; ;) 
    { 
     CAtlREMatchContext<> MatchContext; 
     pszNextText = NULL; 
     if(!Expression.Match(pszText, &MatchContext, &pszNextText)) 
      break; 
     // Here you process the found occurrence 
     pszText = pszNextText; 
    } 
Смежные вопросы