Pergunta

Eu uso o PECL bbcode extensão para analisar BBCode-tags .

Alguém pode me mostrar uma forma de substituir o texto entre as tags BBCode em vez de torno com HTML tags? Eu quero construir um Tag [youtube]:

[youtube]w0ffwDYo00Q[/youtube]

A minha configuração para esta tag parece com isso:

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

O Problema: o texto entre as tags [youtube] (Youtube ID) é necessária por duas vezes (para o objeto e as marcas incorporar), então não posso usar o close_tag como pretendido.

Resultado: a marcação para inclusão do Youtube jogador é criado corretamente, mas depois que o Youtube-ID é impresso:

<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

Alguém sabe como consertar isso?

Agradecemos antecipadamente!

Foi útil?

Solução

Eu não posso testar agora, então não tenho certeza ele funciona ... Mas talvez você pode tentar o seguinte:

A documentação do bbcode_create descreve as chaves / valores você pode usar para configurar sua tag.
Uma dessas chaves é:

content_handling opcional - Dá a callback usado para modificação do conteúdo . Object Notation Oriented suportado apenas uma vez 0.10.1 callback protótipo é nome de cadeia (string $ Content, string $ argumento)

Então, o que se você definir essa propriedade, de modo que é um link para uma função modificar o conteúdo ... Modificando-lo, definindo-o como uma cadeia vazia, por exemplo?

Algo como isto, talvez:

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

E declarando a função remove_handler desta maneira:

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

Ou talvez dessa forma:

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

Com um pouco de sorte, isso pode ser suficiente para remover o conteúdo?


EDIT após o comentário sobre a minha proposta anterior


Oi novamente,

Desta vez, eu tentei o que eu estou sugerindo, e isso parece estar funcionando ; -)

Em primeiro lugar, você pode definir '' tanto para open_tag e close_tag; Dessa forma, o retorno de chamada content_handling será responsável por todo o trabalho.
Algo como isso, então:

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

A função de retorno de chamada, então, parecido com este:

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

É realmente gera toda a tag <object>, incluindo ambas as ocorrências de ID do YouTube.

E se você chamá-lo assim:

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

Você começa esta saída:

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)

O que parece um bocado como algo que deve ser ok ; -)
Na verdade, se você acabou de ouput-lo:

echo $output;

O vídeo é carregado; ele é chamado gato de Simon 'Man Cat fazer' , btw ; -)


Espero que isso resolve o seu problema melhor, desta vez : -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top