0

YouTube データ API を使用して、YouTube プレイリストの合計時間を取得しようとしています。たとえば、http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958<yt:duration='xxx'/>から応答をダウンロードします。私の考えは、各ビデオの長さを秒単位で繰り返し、xxxそれらを合計して合計プレイリストを取得することですランタイム。

それぞれを取得するCAtlRegExpには、次の文字列を使用します。

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

ただし、最初の出現のみに一致し、残りのいずれにも一致しません (以下に貼り付けられたソース コードを参照すると、ループは 1 回だけ繰り返されます)。

次のような他の正規表現文字列をいくつか試しました

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

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

ただし、どちらも機能しませんでした(同じ理由)。

ソース コードからの抜粋を次に示します。ここでは、 が にmcDuration.m_uNumGroups等しいため、 for ループは 1 回だけ繰り返され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 ...ですか?

4

1 に答える 1

1

常に最初 (次) のオカレンスのみが表示されます。他のものを見つけるMatchには、出現がなくなるまでループを続ける必要があります。

    for(; ; )
    {
        CAtlREMatchContext<> MatchContext;
        pszNextText = NULL;
        if(!Expression.Match(pszText, &MatchContext, &pszNextText))
            break;
        // Here you process the found occurrence
        pszText = pszNextText;
    }
于 2013-02-06T10:27:09.860 に答える