Pregunta

Yo uso el Extensión de código BBC PECL para analizar etiquetas BBCode.

¿Alguien puede mostrarme una manera de reemplazando el texto entre las etiquetas BBCode en lugar de circundante ¿Con etiquetas HTML?quiero construir un [youtube] Etiqueta:

[youtube]w0ffwDYo00Q[/youtube]

Mi configuración para esta etiqueta se ve así:

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

El problema:el texto entre el [youtube] Las etiquetas (ID de YouTube) se necesitan dos veces (para etiquetas de objeto y para insertar), por lo que no puedo usar el close_tag Como era la intención.

Resultado:el marcado para la inclusión del reproductor de Youtube se crea correctamente, pero luego se imprime el ID de Youtube:

<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

¿Alguien sabe cómo arreglar esto?

¡Gracias de antemano!

¿Fue útil?

Solución

No puedo realizar la prueba en este momento, así que no estoy seguro de que funcione...Pero tal vez puedas probar esto:

la documentacion de bbcode_create describe las claves/valores que puede utilizar para configurar su etiqueta.
Una de estas claves es:

content_handling opcional - Da el devolución de llamada utilizada para la modificación del contenido.Notación orientada a objetos compatible solo desde 0.10.1 El prototipo de devolución de llamada es el nombre de la cadena (cadena $ contenido, cadena $ argumento)

Entonces, ¿qué pasa si defines esa propiedad para que sea un enlace a una función que modifica el contenido...?¿Modificarlo configurándolo en una cadena vacía, por ejemplo?

Algo como esto, tal vez:

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

Y declarando el remove_handler funcionar de esta manera:

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

O tal vez de esa manera:

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

Con un poco de suerte, ¿esto podría ser suficiente para eliminar el contenido?


EDITAR después del comentario sobre mi propuesta anterior.


Hola de nuevo,

Esta vez, probé lo que sugiero y parece estar funcionando. ;-)

Primero, puedes configurar '' para ambos open_tag y close_tag ;de esa manera, el content_handling callback será responsable de todo el trabajo.
Algo como esto, entonces:

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

La función de devolución de llamada se vería así:

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

En realidad genera todo <object> etiqueta, incluidas ambas apariciones de la identificación de youtube.

Y si lo llamas así:

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

Obtienes este resultado:

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)

Lo cual parece algo que debería estar bien. ;-)
En realidad, si simplemente lo muestra:

echo $output;

El vídeo está cargado;se llama El gato de Simon 'El hombre gato hace', por cierto ;-)


Espero que esto resuelva mejor tu problema, esta vez. :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top