2013-02-28 176 views
1

在我們的論壇上,我們目前正與嵌入對象替換所有的YouTube鏈接,多虧了如下回答:嵌入的YouTube視頻pregreplace

How do I find all YouTube video ids in a string using a regex?

麻煩的是,我們的許多用戶希望發佈直接鏈接到視頻中的特定時間。例如:

http://www.youtube.com/watch?v=jECIv7zlD4c&feature=player_embedded#t=1m15s

注意「#T = 1m15s」

按照YouTube的文件,當你嵌入的開始時間爲視頻需要一個「開始」參數,你不能使用'1m15s'字符串。 '開始'是基於秒數的值。

<object width="425" height="344"> 
<param name="movie" value="http://www.youtube.com/v/jECIv7zlD4c?fs=1&start=75"</param> 
<param name="allowFullScreen" value="true"></param> 
<param name="allowScriptAccess" value="always"></param> 
<embed src="http://www.youtube.com/v/jECIv7zlD4c?fs=1&start=75" 
type="application/x-shockwave-flash" allowscriptaccess="always" width="425" height="344"> 
</embed> 
</object> 

是他們的一種方式,以取代與正則表達式「#1m15s '&開始= 75'?

如果不是,你會如何建議它將用PHP完成,因此它會在論壇帖子(有時會發布多個YouTube視頻鏈接)中遞歸構建對象?

回答

1

preg_replace用於操縱字符串。在你的情況下,你必須在更換之前做一些東西。

也許你應該嘗試使用preg_replace_callback,給出一個回調來計算(X * 60 + Y)。

function sumMinSec($matches) 
{ 
    $minSecMatches = array(); 
    preg_match("/([0-9]*)m([0-9]*)s/", $matches[0], $minSecMatches); 
    return "&start=" . ($minSecMatches[1] * 60 + $minSecMatches[2]); 
} 

,然後調用類似:

$url = "http://www.youtube.com/v/jECIv7zlD4c?fs=1#1m23s"; 
echo preg_replace_callback("/#([0-9]*m[0-9]*s)/", "sumMinSec", $url); 

那麼結果是:

http://www.youtube.com/v/jECIv7zlD4c?fs=1&start=83