На нашем форуме мы в настоящее время заменяем все ссылки на 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)?
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