Вопрос

Я использую Расширение PECL bbcode для разбора BBCode-Тегов.

Кто-нибудь может показать мне способ замена текст между тегами BBCode вместо окружающий это с HTML-тегами?Я хочу построить [youtube] Тег:

[youtube]w0ffwDYo00Q[/youtube]

Моя конфигурация для этого тега выглядит следующим образом:

$tags = array(
    'youtube' => array(
        'type'     => BBCODE_TYPE_NOARG,
        'open_tag' => 
            '<object width="425" height="350">
                 <param name="movie" value="http://www.youtube.com/v/{CONTENT}"></param>
                 <embed src="http://www.youtube.com/v/{CONTENT}" type="application/x-shockwave-flash" width="425" height="350"></embed>
             </object>',
        'close_tag' => '',
    ),
);

В Чем Проблема:текст между [youtube] теги (Youtube ID) необходимы дважды (для тегов object и embed), поэтому я не могу использовать close_tag как и было задумано.

Результат:разметка для включения проигрывателя Youtube создана правильно, но после этого печатается Youtube-ID:

<object width="425" height="350">
    <param name="movie" value="http://www.youtube.com/v/w0ffwDYo00Q"></param>
    <embed src="http://www.youtube.com/v/w0ffwDYo00Q" type="application/x-shockwave-flash" width="425" height="350"></embed>
</object>w0ffwDYo00Q

Кто-нибудь знает, как это исправить?

Заранее спасибо!

Это было полезно?

Решение

Я не могу протестировать прямо сейчас, поэтому не уверен, что это работает...Но, может быть, ты сможешь попробовать это :

Документация по bbcode_create описывает ключи / значения, которые вы можете использовать для настройки своего тега.
Одним из таких ключей является :

content_handling необязательно - Дает обратный вызов, используемый для модификации содержание.Объектно-ориентированная нотация поддерживается только начиная с версии 0.10.1 обратного вызова прототипом является строковое имя (string $content, string $argument)

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

Может быть, что-то вроде этого :

$tags = array(
    'youtube' => array(
        'type'     => BBCODE_TYPE_NOARG,
        'open_tag' => 
            '<object width="425" height="350">
                 <param name="movie" value="http://www.youtube.com/v/{CONTENT}"></param>
                 <embed src="http://www.youtube.com/v/{CONTENT}" type="application/x-shockwave-flash" width="425" height="350"></embed>
             </object>',
        'close_tag' => '',
        'content_handling' => 'remove_handler',
    ),
);

И объявляя о remove_handler функционируйте таким образом :

function remove_handler($content, $argument) {
  return '';
}

Или, может быть, таким образом :

function remove_handler(& $content, $argument) {
  $content = '';
}

Если немного повезет, этого может быть достаточно, чтобы удалить содержимое?


ОТРЕДАКТИРУЙТЕ после комментария к моему предыдущему предложению


Еще раз привет,

На этот раз я попробовал то, что предлагаю, и, кажется, это работает ;-)

Во-первых, вы можете установить '' для обоих open_tag и close_tag ;таким образом, content_handling обратный звонок будет отвечать за всю работу.
Что-то вроде этого, так что :

$tags = array(
    'youtube' => array(
        'type'     => BBCODE_TYPE_NOARG,
        'open_tag' => '',
        'close_tag' => '',
        'content_handling' => 'generate_youtube_tag',
    ),
);

Тогда функция обратного вызова выглядела бы следующим образом :

function generate_youtube_tag($content, $argument) {
    // TODO some security checks on $content !
    // Here, I've assumed that a youtube id only contains letters and numbers
    // But I don't know it that's always the case
    if (preg_match('/^[\d\w]+$/', $content)) {
        return <<<NEW_CONTENT
<object width="425" height="350">
    <param name="movie" value="http://www.youtube.com/v/{$content}"></param>
    <embed src="http://www.youtube.com/v/{$content}" type="application/x-shockwave-flash" width="425" height="350"></embed>
</object>
NEW_CONTENT;
    }
    else {
        return '';
    }
}

Это фактически генерирует целое <object> тег, включающий оба варианта идентификатора YouTube.

И если вы назовете это вот так :

$text = '[youtube]w0ffwDYo00Q[/youtube]';
$bbHandler = bbcode_create($tags);
$output = bbcode_parse($bbHandler, $text);
var_dump($output);

Вы получаете этот результат :

string '<object width="425" height="350">
    <param name="movie" value="http://www.youtube.com/v/w0ffwDYo00Q"></param>
    <embed src="http://www.youtube.com/v/w0ffwDYo00Q" type="application/x-shockwave-flash" width="425" height="350"></embed>
</object>' (length=246)

Что вроде как выглядит как то, что должно быть в порядке ;-)
На самом деле, если вы просто откажетесь от этого :

echo $output;

Видео загружено ;это называется Кот Саймона "Человек-кошка делает", кстати ;-)


Надеюсь, на этот раз это решит вашу проблему лучше :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top