2013-02-28 242 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