我使用 PECL bbcode扩展来解析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' => '',
    ),
);

问题:close_tag标签之间的文本(Youtube ID)需要两次(对于object和embed标签),所以我不能按预期使用<=>。

结果:正确创建了包含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回调后才支持   prototype是字符串名称(字符串   $ 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;这样,<object>回调将负责所有工作。
像这样的东西,所以:

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

它实际上会生成整个<=>标记,包括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;

视频已加载;它被称为西蒙的猫'猫人',顺便说一句; - )

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top