【问题标题】:How to create [youtube]-Tag for PECL bbcode extension?如何为 PECL bbcode 扩展创建 [youtube]-Tag?
【发布时间】:2010-11-15 09:13:37
【问题描述】:

我使用PECL bbcode extension 来解析BBCode-Tags。

谁能告诉我一种替换 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)之间的文本需要两次(用于对象和嵌入标签),所以我不能按预期使用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

有人知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

    标签: php youtube bbcode pecl


    【解决方案1】:

    我现在无法测试,所以不确定它是否有效......但也许你可以试试这个:

    bbcode_create 的文档描述了可用于配置标签的键/值。
    其中一个键是:

    content_handling 可选 - 给出 回调用于修改 内容。面向对象表示法 仅从 0.10.1 回调开始支持 原型是字符串名称(字符串 $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_tagclose_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 '';
        }
    }
    

    它实际上生成了整个&lt;object&gt; 标签,包括两次出现的youtube id。

    如果你这样称呼它:

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

    视频已加载;它被称为 Simon's Cat 'Cat Man do',顺便说一句 ;-)


    希望这能更好地解决您的问题,这次 :-)

    【讨论】:

    • 感谢您的回答。内容被删除,但不幸的是,这发生在它被渲染到 HTML 之前;)
    • 刚刚用另一个提议编辑了我的答案,这一次似乎可行;-)
    • 您好,感谢您进一步调查 :) 我想我会那样做的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2010-10-08
    • 2011-12-19
    • 2014-01-29
    相关资源
    最近更新 更多