在我们的论坛上,我们目前用嵌入式对象替换所有youtube链接,这要归功于以下答案:
How do I find all YouTube video ids in a string using a regex?
麻烦的是,我们的许多用户希望直接在视频中的特定时间发布链接。 E.g:
http://www.youtube.com/watch?v=jECIv7zlD4c&feature=player_embedded#t=1m15s
请注意“#t = 1m15s”
根据youtube文档,当您在视频中嵌入开始时间时需要'start'参数,您不能使用'1m15s'字符串。 'start'是一个基于秒数的值。
<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>
他们是否可以用'&amp; start = 75'替换正则表达式中的'#1m15s'?
如果没有,您会如何建议使用PHP来完成它,以便在论坛帖子中重新构建对象(有时会发布多个YouTube视频链接)?
答案 0 :(得分: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