PECL bbcode uzatılması için [youtube]-Tag nasıl oluşturulur?

1 Cevap php

Ben BBCode-Etiketler ayrıştırma için PECL bbcode extension kullanın.

Herkes bana HTML etiketleri ile yerine surrounding bunun BBCode etiketleri arasındaki replacing metnin bir yol gösterebilir misiniz? Ben bir [youtube] Tag inşa etmek istiyorum:

[youtube]w0ffwDYo00Q[/youtube]

Bu etiket için benim yapılandırma Bu gibi görünüyor:

$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' => '',
    ),
);

Sorun: [youtube] etiketleri (Youtube ID) arasındaki metin (object ve embed etiketleri için) iki kez gerekli böylece amaçlanan gibi close_tag kullanamazsınız.

Sonuç: Youtube oyuncunun dahil biçimlendirme doğru oluşturulmuş ama bundan sonra Youtube-ID yazdırılır:

<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

Herkes bu düzeltmek için nasıl bilir?

Şimdiden teşekkürler!

1 Cevap

Ben şu anda test edemez, çok emin değilim çalışıyor ... Ama belki bu deneyebilirsiniz:

The documentation of bbcode_create describes the keys/values you can use to configure your tag.
One of these keys is :

content_handling optional - Gives the callback used for modification of the content. Object Oriented Notation supported only since 0.10.1 callback prototype is string name(string $content, string $argument)

Peki, ne tanımlarsanız bu özellik, bu örneğin, bir boş dize ayarlayarak bunu değiştirme ... içeriğini değiştirerek bir işleve bir bağlantı öyle mi?

Belki de böyle bir şey:

$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',
    ),
);

Ve remove_handler işlevini bu şekilde ilan:

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

Ya da belki bu şekilde:

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

Biraz şans ile, bu içeriği kaldırmak için yeterli olabilir?


EDIT after the comment about my previous proposition


Merhaba tekrar,

Bu sefer, ben düşündüren bir şey denedim, ve ;-) çalışıyor gibi görünüyor

First, you can set '' for both open_tag and close_tag ; that way, the content_handling callback will be responsible for all the work.
Something like this, so :

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

Geri arama fonksiyonu daha sonra bu gibi görünecektir:

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

Aslında YouTube'un id hem olaylara dahil tüm <object> etiketini oluşturur.

Ve bunu şöyle diyebilir:

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

Bu çıktıyı almak:

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)

Which kinda looks like something that should be ok ;-)
Actually, if you just ouput it :

echo $output;

Video yüklenir; o Simon's Cat 'Cat Man do', btw ;-) denir


Hope this solves your problem better, this time :-)