Это моя функция:
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>
Что значит не работает? Не удается получить идентификатор видео из этой функции или что? Если вы не можете получить идентификатор видео из этой функции, вам нужно опубликовать код в этой функции, а не в этой.
Привет, извините за мою плохую формулировку. Я снова пересмотрел свой вопрос.






Стандарт 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])]
У вас есть образец содержимого?