Question

J'utilise l'extension PECL bbcode pour analyser les balises BBCode .

Quelqu'un peut-il me montrer comment remplacer le texte entre les balises BBCode au lieu de l'entourer avec des balises HTML? Je veux construire un [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 balises close_tag (identifiant Youtube) est nécessaire deux fois (pour les balises object et embed), de sorte que je ne peux pas utiliser <<> comme prévu.

Résultat: le balisage pour l'inclusion du lecteur Youtube est créé correctement mais après cela, l'ID Youtube 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

Quelqu'un sait comment résoudre ce problème?

Merci d'avance!

Était-ce utile?

La solution

Je ne peux pas tester pour le moment, donc je ne suis 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 tag.
L'une de ces clés est:

  

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

Alors, que se passe-t-il si vous définissez cette propriété, de sorte qu'il s'agisse d'un lien vers une fonction modifiant le contenu ... La modifier en le définissant par exemple comme chaîne vide?

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 en déclarant la remove_handler fonction 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 suffire à supprimer le contenu?

EDIT après le commentaire sur ma proposition précédente

Bonjour à nouveau,

Cette fois, j'ai essayé ce que je propose et cela semble fonctionner ; -)

Tout d'abord, vous pouvez définir '' à la fois open_tag et close_tag; De cette façon, le rappel <object> 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 ressemblerait alors à 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 réalité l'intégralité de la balise <=>, y compris les deux occurrences de l'ID de 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 à quelque chose qui devrait convenir ; -)
En fait, si vous le sortez juste:

echo $output;

La vidéo est chargée. ça s'appelle Le «Cat Man do» de Simon's Cat , ; -)


J'espère que cela résoudra mieux votre problème, cette fois-ci : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top