2009-07-30 7 views
1

J'utilise le PECL bbcode extension pour analyser les balises BBCode.Comment créer [youtube] -Tag pour extension PECL bbcode?

Quelqu'un peut-il me montrer une façon de remplacer le texte entre les balises BBCode au lieu de autour avec des balises HTML? Je veux construire une [youtube] Tag:

[youtube]w0ffwDYo00Q[/youtube] 

Ma configuration pour cette balise ressemble à ceci:

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

Le problème: le texte entre les [youtube] balises (Youtube ID) est nécessaire deux fois (pour objet et embed tags) donc je ne peux pas utiliser le close_tag comme prévu.

Résultat: le balisage pour l'inclusion du lecteur YouTube est créé correctement, mais après que le Youtube ID est imprimé:

<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 

Tout le monde sait comment résoudre ce problème?

Merci d'avance!

Répondre

2

Je ne peux pas tester en ce moment, donc pas sûr que cela fonctionne ... Mais vous pouvez peut-être essayer ceci:

La documentation de bbcode_create décrit les clés/valeurs que vous pouvez utiliser pour configurer votre balise.
L'une de ces clés est:

content_handling en option - Attribue la rappel utilisé pour la modification du contenu . Notation orientée objet uniquement pris en charge depuis 0.10.1 rappel prototype est le nom de chaîne (chaîne contenu $, string $ argument)

Alors, si vous définissez cette propriété, de sorte qu'il est un lien vers une fonction modifier le contenu ... le modifier en le définissant sur une chaîne vide, par exemple?

Quelque chose comme ça, peut-être:

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

et déclarant la fonction remove_handler de cette façon:

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

Ou peut-être de cette façon:

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

Avec un peu de chance, cela pourrait être suffisant pour supprimer le contenu?


EDIT après le commentaire au sujet de ma proposition précédente


Salut à nouveau,

Cette fois-ci, je l'ai essayé ce que je veux dire, et il semble fonctionner ;-)

D'abord, vous pouvez définir '' pour les deux open_tag et close_tag; De cette façon, le rappel content_handling sera responsable de tout le travail.
Quelque chose comme ça, alors:

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

La fonction de rappel alors ressembler à ceci:

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

Il génère en fait toute étiquette <object>, y compris les occurences de l'id du youtube.

Et si vous l'appelez comme ceci:

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

Vous obtenez cette sortie:

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) 

Ce qui ressemble un peu quelque chose qui devrait être ok ;-)
En fait, si vous venez de le sortir:

echo $output; 

La vidéo est chargée; il est appelé 'Cat Man Do Cat Simon, btw ;-)


Hope this résout votre problème mieux, cette fois-ci :-)

+0

Merci pour votre réponse. Le contenu est supprimé, mais malheureusement cela arrive avant qu'il ne soit rendu dans le HTML;) – marcusj

+0

Comment :-(dommage :-( –

+0

Juste édité ma réponse, avec une autre proposition, qui semble fonctionner, cette fois ;-) –