2009-07-30 7 views
1

Ich benutze die PECL bbcode extension zum Parsen von BBCode-Tags.Wie erstelle ich [youtube] -Tag für PECL BBCode Erweiterung?

Kann mir jemand zeigen einen Weg den Text zwischen den BBCode-Tags ersetzen statt umgebenden es mit HTML-Tags? Ich mag einen [youtube] Tag bauen:

[youtube]w0ffwDYo00Q[/youtube] 

Meine Konfiguration für diesen Tag sieht wie folgt aus:

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

Das Problem: der Text zwischen den [youtube] Tags (Youtube-ID) wird zweimal benötigt (zum Objekt und Tags einbetten), so kann ich das close_tag nicht wie beabsichtigt verwenden.

Ergebnis: das Markup für die Aufnahme von Youtube-Player korrekt erstellt, aber nach, dass der Youtube-ID gedruckt wird:

<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 

Jeder weiß, wie dieses Problem beheben?

Vielen Dank im Voraus!

Antwort

2

Ich kann jetzt nicht testen, also nicht sicher, dass es funktioniert ... Aber vielleicht können Sie dies versuchen:

Die Dokumentation von bbcode_create beschreibt die Schlüssel/Werte, die Sie Ihren Tag konfigurieren können.
Einer dieser Schlüssel ist:

content_handling optional - Gibt die Rückruf zur Modifikation des Gehalt verwendet. Objektorientierte Notation nur unterstützt, da 0.10.1 Rückruf Prototyp ist string name (string $ content, string $ Argument)

Also, was ist, wenn Sie diese Eigenschaft definieren, so dass es ein Link zu einer Funktion Ändern des Inhalts ... Ändern Sie ihn zum Beispiel, indem Sie ihn auf eine leere Zeichenfolge setzen?

So etwas, vielleicht:

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

Oder vielleicht auf diese Weise:

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

Und die remove_handler Funktion auf diese Weise erklärt

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

Mit etwas Glück, Dies könnte ausreichen, um den Inhalt zu entfernen?


EDIT nach dem Kommentar zu meinem vorherigen Satz


Hallo wieder,

Dieses Mal habe ich versucht, was ich vorschlage, und es scheint zu funktionieren ;-)

Erstens können Sie '' gesetzt sowohl für open_tag und close_tag; Auf diese Weise wird der content_handling Rückruf für die gesamte Arbeit verantwortlich sein. sehen wie folgt aus

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

Die Callback-Funktion würde dann:
So etwas wie dies, so

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

Es erzeugt tatsächlich die ganze <object> Tag, einschließlich der beiden Vorkommen der YouTube-ID.

Und wenn man es so nennen:

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

Sie diese Ausgabe erhalten:

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) 

Welche ein bisschen wie etwas aussieht, das ;-)
Eigentlich ok sein sollte, wenn Sie geben es einfach aus:

echo $output; 

Das Video ist geladen. es Simons Katze 'Katze Mann tun', btw ;-)


Hope this löst Ihr Problem besser, diesmal :-) für Ihre Antwort

+0

Dank genannt. Der Inhalt wird entfernt, aber leider geschieht dies, bevor es in den HTML-Code gerendert wird;) – marcusj

+0

Wie :-(schade :-( –

+0

Habe gerade meine Antwort bearbeitet, mit einem anderen Vorschlag, der diesmal zu funktionieren scheint ;-) –

Verwandte Themen