我使用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
有人知道如何解决这个问题吗?
提前致谢!
答案 0 :(得分:2)
我现在无法测试,所以不确定它是否有效......但也许你可以试试这个:
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
;这样,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 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;
视频已加载;它被称为西蒙的猫'猫人',顺便说一句; - )
希望这能更好地解决您的问题,这次: - )