質問

BBCodeタグの解析に PECL bbcode拡張機能を使用しています。

HTMLタグで囲むの代わりに、BBCodeタグの間でテキストを置き換える方法を教えてもらえますか? [youtube]タグを作成したい:

[youtube]w0ffwDYo00Q[/youtube]

このタグの私の設定は次のようになります:

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

問題:close_tagタグ(Youtube ID)の間のテキストは2回必要です(オブジェクトおよび埋め込みタグ用)。<=>を意図したとおりに使用できません。

結果:Youtubeプレーヤーを含めるためのマークアップは正しく作成されますが、その後Youtube-IDが印刷されます:

<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

誰でもこれを修正する方法を知っていますか?

事前に感謝します!

役に立ちましたか?

解決

今はテストできないので、動作するかどうかはわかりません...しかし、おそらくこれを試すことができます:

bbcode_create のドキュメントでキーについて説明していますタグの構成に使用できる/ values。
これらのキーの1つは次のとおりです。

  

content_handlingオプション-を与える   の変更に使用されるコールバック   コンテンツ。オブジェクト指向表記   0.10.1コールバック以降のみサポート   プロトタイプはstring name(string   $ content、string $ argument)

では、コンテンツを変更する関数へのリンクとなるようにそのプロパティを定義するとどうなりますか?たとえば、空の文字列に設定して変更しますか?

このようなもの、おそらく:

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

そして、この方法でremove_handler関数を宣言します:

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

または多分その方法:

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

少し運が良ければ、これでコンテンツを削除できますか?


以前の提案に関するコメントの後に編集


こんにちは、

今回は、私が提案していることを試してみましたが、機能しているようです;-)

最初に、''open_tagの両方にclose_tagを設定できます。そうすれば、<object>コールバックがすべての作業を担当します。
次のようなものです。

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

コールバック関数は次のようになります:

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

実際には、YouTubeのIDの両方の出現を含む<=>タグ全体が生成されます。

そして、このように呼び出す場合:

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

この出力が表示されます:

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)

問題ないように見えるもの;-)
実際、出力するだけの場合:

echo $output;

ビデオがロードされます。それは Simon's Cat 'Cat Man do' と呼ばれますが、;-)


これで問題が解決されることを願っています。今回は:-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top