Я пытаюсь превратить ссылки YouTube в встроенные фреймы, чтобы воспроизводить видео. Однако мой текущий код заменяет все предложение кодом вставки. Что я хочу сделать, так это просто преобразовать ссылку YouTube в код для встраивания и оставить весь текст невредимым.
Пример. This is a youtube link: https://www.youtube.com/watch?v=T-8XurAKMkU and some text after.
Включено: This is a youtube link: <embed> and some text after.
Мой текущий код:
$testing = "This is a youtube link: https://www.youtube.com/watch?v=T-8XurAKMkU and some text after.";
echo $core->convertyoutube($testing);
И функция:
public function convertyoutube($link) {
if (strpos($link, 'youtube.com/watch?v=') == true) {
$url = $link;
parse_str(parse_url($url, PHP_URL_QUERY), $youtube_array);
$videoid = $youtube_array['v'];
$embed = "<iframe width='420' height='315' src='https://www.youtube.com/embed/".$videoid."'></iframe>"; // what it should create with the extracted code
return $embed;
}
}
Ну, вы возвращаете только код для вставки:
return $embed;
Вам нужно заменить только часть youtube:
public function convertyoutube($link) {
$position = strpos($link, 'youtube.com/watch?v=');
if ($position !== false) {
$chunks = explode(' ', $link);
foreach ($chunks as &$chunk) {
$isYoutubeLink = strpos($chunk, 'youtube.com/watch?v=');
if ($isYoutubeLink !== false) {
$url = $chunk;
parse_str(parse_url($url, PHP_URL_QUERY), $youtube_array);
$videoid = $youtube_array['v'];
$chunk = "<iframe width='420' height='315' src='https://www.youtube.com/embed/".$videoid."'></iframe>"; // what it should create with the extracted code
}
}
return implode(' ', $chunks);
}
}
Он работает с несколькими ссылками в предложении. Я думаю, что есть "лучший" способ использования regexp, однако я не очень хорошо разбираюсь в regexp и не люблю его использовать там, где это не обязательно.
Вы могли бы сделать все это с помощью одного регулярного выражения.
echo preg_replace('/https?:\/\/(?:www\.)?youtube\.com\/watch\?v=(.+?)(?:&|\s|$)/',
'<iframe width="420" height="315" src="https://www.youtube.com/embed/$1"></iframe>',
'This is a youtube link: https://www.youtube.com/watch?v=T-8XurAKMkU and some text after.');
Вывод:
This is a youtube link: https://www.youtube.com/watch?v=T-8XurAKMkU and some text after.
Демо-версия Regex101: https://regex101.com/r/cT2mW1/2
Будет лучше, если вы конвертируете ссылки в front-end view с помощью javascript, чтобы избежать избыточной загрузки сервера. Но это ваш выбор.
Одно видео с YouTube имеет разные ссылки:
1) https://www.youtube.com/watch?v=lfKON5AMvTM
2) https://youtu.be/lfKON5AMvTM
По этой причине вы должны написать свои коды, как это, чтобы поймать все типы ссылок на YouTube:
public function convertYouTube($content) {
$content = preg_replace("/http(s)?:\/\/youtu\.be\/([^\40\t\r\n\<]+)/i", '<iframe width="420" height="315" src="https://www.youtube.com/embed/$2"></iframe>', $content);
$content = preg_replace("/http(s)?:\/\/(w{3}\.)?youtube\.com\/watch\/?\?v=([^\40\t\r\n\<]+)/i", '<iframe width="420" height="315" src="https://www.youtube.com/embed/$3"></iframe>', $content);
return $content;
}
$embed
, что случилось с$link
? Вам нужно будет это осознать (.).