Передать preg заменить переменную для функции

Это моя функция:

function bbc2html($content) {
    $search = array (
      '/(\[b\])(.*?)(\[/b\])/',
      '/(\[u\])(.*?)(\[/u\])/',
      '/(\[i\])(.*?)(\[/i\])/',
      '/(\[youtube\])(.*?)(\[/youtube\])/'
    );
  
    $replace = array (
      '<b>$2</b>',
      '<u>$2</u>',
      '<i>$2</i>',
      '<div class = "video_wrapper card border-0 shadow text-center m-2" style = "width: 25rem;">
       <div class = "video_trigger card-body" data-source = "'.getYoutubeVideoID('$2').'" data-type = "youtube">
          <p class = "text-center">As soon as you click on the button you accept that cookies from YouTube to be loaded</p>
          <input type = "button" class = "btn btn-success" value = "OK">
          <a href = "$2" type = "button" target = "_blank" class = "btn btn-danger"><i class = "fa-brands fa-youtube pe-1"></i>direct link</a>
       </div>
       <div class = "video_layer" style = "display: none;">
          <iframe src = "" border = "0" data-scaling = "true" data-format = "16:9" style = "height: 0px;"></iframe>
       </div>
       </div>'
    );
    
    return preg_replace($search, $replace , $content);
  }
function getYoutubeVideoID($link):string{
    $baseUrl = parse_url($link, PHP_URL_HOST); 

    if ($baseUrl == "youtu.be"){
        $urlParts = explode('/',$link);
        $id = end($urlParts);
    } elseif (preg_match('/(youtube.com)/i',$baseUrl)) {
        if (preg_match('/(youtube.com/watch\?v=)/i',$link)){
            $urlParts = explode('?v=',$link);
            $id = end($urlParts);
        } elseif (preg_match('/(youtube.com/)/i',$link)) {
            $urlParts = explode('/',$link);
            $id = end($urlParts);
        } else {
            return "";
        }
    } else {
        return "";
    }

    return $id;
}

Я хочу передать переменную ($2, содержит ссылку на видео на YouTube) в функцию (getYoutubeVideoID, возвращает только идентификатор видео), но она просто передает «$2» вместо ссылки.

Пример: [youtube] https://thewikihow.com/video_LXb3EKWsInQ [/youtube]

Это следует заменить на:

<div class = "video_wrapper card border-0 shadow text-center m-2" style = "width: 25rem;">
       <div class = "video_trigger card-body" data-source = "LXb3EKWsInQ" data-type = "youtube">
          <p class = "text-center">As soon as you click on the button you accept that cookies from YouTube to be loaded</p>
          <input type = "button" class = "btn btn-success" value = "OK">
          <a href = "https://thewikihow.com/video_LXb3EKWsInQ" type = "button" target = "_blank" class = "btn btn-danger"><i class = "fa-brands fa-youtube pe-1"></i>direct link</a>
       </div>
       <div class = "video_layer" style = "display: none;">
          <iframe src = "" border = "0" data-scaling = "true" data-format = "16:9" style = "height: 0px;"></iframe>
       </div>
       </div>

У вас есть образец содержимого?

vee 14.01.2023 18:24

Что значит не работает? Не удается получить идентификатор видео из этой функции или что? Если вы не можете получить идентификатор видео из этой функции, вам нужно опубликовать код в этой функции, а не в этой.

vee 14.01.2023 18:25

Привет, извините за мою плохую формулировку. Я снова пересмотрел свой вопрос.

Heisenberg 14.01.2023 19:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Стандарт preg_replace не позволяет вам выполнять функцию для замещающих значений, вы можете передавать только литералы с замещающими заполнителями.

Вы можете обойти это несколькими способами, однако preg_replace_callback в этом конкретном случае может быть проще всего читать. В следующем коде я также позволил себе объединить ваши первые три шорткода в один, который использует обратную ссылку. Я также удалил захваты, которые вы используете (просто для того, чтобы помочь мне в отладке).

<?php

var_dump(bbc2html('[b]stuff[/b][youtube]abc[/youtube]'));

function getYoutubeVideoID($id)
{
    // Just a demo function
    return '!!'.$id.'!!';
}

function bbc2html($content)
{
    $search = '/\[(b|u|i)]([^\[]*)\[/\1]/';
    $replace = '<$1>$2</$1>';

    $newContent = preg_replace($search, $replace, $content);

    return preg_replace_callback(
        '/\[youtube](.*?)\[/youtube]/',
        static function ($matches) {
            return '<div class = "video_wrapper card border-0 shadow text-center m-2" style = "width: 25rem;">
      <div class = "video_trigger card-body" data-source = "'.getYoutubeVideoID($matches[1]).'" data-type = "youtube">
          <p class = "text-center">As soon as you click on the button you accept that cookies from YouTube to be loaded</p>
          <input type = "button" class = "btn btn-success" value = "OK">
          <a href = "$2" type = "button" target = "_blank" class = "btn btn-danger"><i class = "fa-brands fa-youtube pe-1"></i>direct link</a>
      </div>
      <div class = "video_layer" style = "display: none;">
          <iframe src = "" border = "0" data-scaling = "true" data-format = "16:9" style = "height: 0px;"></iframe>
      </div>
      </div>';
        },
        $newContent
    );
}

Демо: https://3v4l.org/0hkQj

В качестве небольшого улучшения вы можете написать альтернативы \[(b|u|i)] как класс символов \[([bui])]

The fourth bird 15.01.2023 17:28

Другие вопросы по теме