Frage

Ich verwende den PECL bbcode Erweiterung für das Parsen von BBCode-Schlagwörter .

Kann mir jemand zeigt einen Weg von ersetzen der Text zwischen den BBCode-Tags anstelle von Umgebung es mit HTML-Tags? Ich mag einen [youtube] Tag erstellen:

[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 (für Objekt und embed-Tags), so kann ich die close_tag nicht verwenden, wie beabsichtigt.

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

<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!

War es hilfreich?

Lösung

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

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

  

content_handling optional - Gibt die    Rückruf zur Modifizierung der verwendeten   Inhalt . Objektorientierte Notation   da 0.10.1 Rückruf nur dann unterstützt,   Prototyp ist string name (string   $ Content, string $ Argument)

Also, was ist, wenn Sie diese Eigenschaft definieren, so dass es ein Link zu einer Funktion ist es, den Inhalt zu modifizieren ... ändern Sie es durch eine leere Zeichenfolge, zum Beispiel Einstellung?

So etwas, vielleicht:

$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 erklärt die remove_handler Funktion auf diese Weise:

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

Oder vielleicht diese Art und Weise:

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

Mit etwas Glück, könnte dies genug sein, um den Inhalt zu entfernen?


EDIT nach dem Kommentar über meinen vorherigen Satz


Hallo wieder,

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

Sie können zunächst '' für beide open_tag und close_tag gesetzt; auf diese Weise wird der content_handling Rückruf für die Arbeit verantwortlich.
So etwas wie dies, so:

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

Die Callback-Funktion würde dann wie folgt aussehen:

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 Sie es so nennen:

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

Sie erhalten diese Ausgabe:

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 sieht ein bisschen wie etwas, das in Ordnung sein sollte ; -)
Eigentlich, wenn Sie nur ouput es:

echo $output;

Das Video wird geladen; es Simons Katze 'Katze Mann tun' genannt, btw ; -)


Hoffe, dass dies Ihr Problem löst besser, diesmal : -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top