Как создать [youtube] -Tag для расширения bccode PECL? - PullRequest
1 голос
/ 30 июля 2009

Я использую расширение 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) требуется дважды (для тегов объекта и встраивания), поэтому я не могу использовать close_tag по назначению.

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

<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

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

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

1 Ответ

2 голосов
/ 30 июля 2009

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

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

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

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

Примерно так, может быть:

$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;

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


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

...