Эта функция вставляет видео youtube, если их можно найти в строке.
Мой вопрос заключается в том, что было бы самым простым способом захватить только встроенное видео (iframe и только первое, если есть больше) и игнорировать остальную часть строки.
function youtube($string,$autoplay=0,$width=480,$height=390) { preg_match('#(v\/|watch\?v=)([\w\-]+)#', $string, $match); return preg_replace( '#((http://)?(www.)?youtube\.com/watch\?[=a-z0-9&_;-]+)#i', "<div align=\"center\"><iframe title=\"YouTube video player\" width=\"$width\" height=\"$height\" src=\"http://www.youtube.com/embed/$match[2]?autoplay=$autoplay\" frameborder=\"0\" allowfullscreen></iframe></div>", $string); }
Хорошо, я думаю, я вижу, чего вы пытаетесь достичь. Пользователь вводит блок текста (какой-то комментарий или что-то еще), и вы находите URL-адрес YouTube в этом тексте и заменяете его фактическим кодом встраивания видео.
Вот как я его модифицировал:
function youtube($string,$autoplay=0,$width=480,$height=390) { preg_match('#(?:http://)?(?:www\.)?(?:youtube\.com/(?:v/|watch\?v=)|youtu\.be/)([\w-]+)(?:\S+)?#', $string, $match); $embed = <<<YOUTUBE <div align="center"> <iframe title="YouTube video player" width="$width" height="$height" src="http://www.youtube.com/embed/$match[1]?autoplay=$autoplay" frameborder="0" allowfullscreen></iframe> </div> YOUTUBE; return str_replace($match[0], $embed, $string); }
Поскольку вы уже находите URL-адрес с помощью первого preg_match()
, нет необходимости запускать другую функцию регулярного выражения для ее замены. str_replace()
весь URL-адрес, а затем выполните простой str_replace()
всего вашего матча ( $match[0]
). Видеокод фиксируется в первом подшаблоне ( $match[1]
). Я использую preg_match()
потому что вы хотите только сопоставить первый найденный URL. Вам нужно будет использовать preg_match_all()
и немного изменить код, если вы хотите совместить все URL-адреса, а не только первые.
Вот объяснение моего регулярного выражения:
(?:http://)? # optional protocol, non-capturing (?:www\.)? # optional "www.", non-capturing (?: # either "youtube.com/v/XXX" or "youtube.com/watch?v=XXX" youtube\.com/(?:v/|watch\?v=) | youtu\.be/ # or a "youtu.be" shortener URL ) ([\w-]+) # the video code (?:\S+)? # optional non-whitespace characters (other URL params)