我試圖使用youtube數據api獲得YouTube播放列表的總持續時間。我從例如http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958下載響應,我的想法是遍歷每個<yt:duration='xxx'/>
發生的地方,其中xxx
是以秒爲單位的每個視頻持續時間,並總結它們以獲得總播放列表運行時間。匹配不止一個組與CAtlRegExp
爲了得到每個i使用CAtlRegExp
與以下字符串:
<yt:duration seconds='{[0-9]+}'/>
但是它僅匹配的第一次出現,而不是任何其餘的(指以下粘貼的源代碼,只在循環迭代一旦)。
我嘗試了一些其他的正則表達式的字符串像
(<yt:duration seconds='{[0-9]+}'/>)
(<yt:duration seconds='{[0-9]+}'/>)*
但他們沒有工作,要麼(同樣的原因)。
下面是從源代碼的提取物,其中的for循環遍歷只有一次,因爲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 ...
的出現次數是否匹配?