Предварительная установка встроенного видео в YouTube

На нашем форуме мы в настоящее время заменяем все ссылки на YouTube со встроенными объектами, благодаря следующему ответу:

Как найти все идентификаторы видео YouTube в строке с использованием регулярного выражения?

Беда в том, что многие из наших пользователей хотят опубликовать ссылку непосредственно на время участия в видео. Например:.

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>

Является ли их способ заменить '# 1m15s' в regex с '& start = 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