Intereting Posts
Каков наилучший способ передачи или доступа к другим объектам в других классах PHP? PHP – Неустранимая ошибка: неподдерживаемые типы операндов Loop, отдельный процесс для последней записи (простейшее решение) Получить ВСЕ результаты из базы данных с именем пользователя Внедрение системы событий php Проводка изображений через wp.uploadFile XML RPC Выход PHPExcel искажен Запрос MySQL для поиска нескольких атрибутов и value_id Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, null указан в Как найти ширину изображения с помощью PHP? Получить случайный элемент из массива .php Случайное изображение служило .jpg на внешнем сайте Представление ajax-формы с php Концепция использования библиотеки очистителя html Существует ли стандартный скелет или инструкции для создания пакета Symfony2 с открытым исходным кодом в комплекте с travis-ci и композитором?

Замените URL-адрес YouTube в тексте кодом HTML-кода

Эта функция вставляет видео 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)