Замените ссылку YouTube вставкой и оставьте другой текст без повреждений

1

Я пытаюсь превратить ссылки 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;

        }


    }
  • 0
    Вы только что вернули $embed , что случилось с $link ? Вам нужно будет это осознать (.).
  • 0
    Я храню его в $ url, который позже использую в parse_str.
Показать ещё 5 комментариев
Теги:
oop
replace

3 ответа

1
Лучший ответ

Ну, вы возвращаете только код для вставки:

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 и не люблю его использовать там, где это не обязательно.

  • 0
    Отлично! Это хороший способ сделать это без регулярных выражений. Спасибо.
1

Вы могли бы сделать все это с помощью одного регулярного выражения.

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

  • 0
    Спасибо за чаевые. Я не очень опытный с регулярным выражением. Постараюсь запомнить его для дальнейшего использования!
  • 0
    Демонстрация regex101 дает перерыв на стороне всего, что используется. Если у вас есть конкретный вопрос по этому поводу, пожалуйста, задавайте.
0

Будет лучше, если вы конвертируете ссылки в 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню