Pregunta

Me gustaría trabajar en un filtro bbcode para un sitio web php. (Estoy usando cakephp, sería un ayudante de bbcode) Tengo algun requerimiento.

Los códigos Bb se pueden anidar. Entonces, algo así es válido.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcodes puede tener 0 o más parámetros.

Ejemplo:

[video: url="url", width="500", height="500"]Title[/video]

Los códigos Bb pueden tener múltiples comportamientos.

Digamos que [url]text[/url] se transformaría en [url:url="text"]text[/url] o el video bbcode podría elegir entre youtube, dailymotion ...

Creo que cubre la mayoría de mis necesidades. Ya hice algo con regex. Pero mi mayor problema fue hacer coincidir los parámetros. De hecho, obtuve bbcode anidado para trabajar y bbcode con 0 parámetros. Pero cuando agregué una coincidencia de expresiones regulares para los parámetros, no coincidió correctamente con bbcode anidado.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // No fue. * pero el emparejador no gready

No tengo la expresión regular completa conmigo en este momento, pero tenía algo que se parecía a eso (arriba).

Entonces, ¿hay alguna manera de hacer coincidir bbcode de manera eficiente con regex u otra cosa? Lo único que se me ocurre es usar el patrón de visitante y dividir mi texto con cada etiqueta posible de esta manera, puedo tener un poco más de control sobre mi análisis de texto y probablemente podría validar mi documento, así que si el texto de entrada no No tiene bbcode válido. Podría notificar al usuario con un error antes de guardar cualquier cosa.

Usaría sablecc para crear mi analizador de texto. http://sablecc.org/

¿Alguna idea mejor? o algo que pueda conducir a un analizador eficiente y flexible de bbcode?

Gracias y perdón por mi mal inglés ...

¿Fue útil?

Solución

Hay un pecl y PEAR Biblioteca de análisis BBCode. El software es bastante difícil sin reinventar años de trabajo por su cuenta.

Si ninguno de esos es una opción, me concentraría en convertir el BBCode en una cadena XML válida y luego usar su rutina de análisis XML favorita en eso. Una idea muy ruda aquí, pero

  1. Ejecute el código a través de htmlspecialchars para escapar de cualquier entidad que necesite escapar

  2. Transforma todos los caracteres [y] en < y > respectivamente

  3. No olvide dar cuenta de los dos puntos en casos como [tagname:

Si el BBCode se anidó correctamente, debería estar listo para pasar esta cadena a un objeto de análisis XML (SimpleXML, DOMDocument, etc.)

Otros consejos

Hay varias bibliotecas existentes para analizar BBCode, puede ser más fácil analizarlas que intentar crear las suyas propias:

Aquí hay un par, estoy seguro de que hay más si miras a tu alrededor:
PECL bbcode
PEAR HTML_BBCodeParser

He estado investigando los analizadores de bbcode. La mayoría de ellos usan expresiones regulares y PHP4 y producen errores en PHP 5.2+ o no funcionan en absoluto. PECL bbcode y PEAR HTML_BBCodeParser ya no parecen mantenerse (finales de 2012) y no se instalan fácilmente en la configuración de alojamiento compartido con el que tengo que trabajar. StringParser_BBCode funciona con algunos ajustes menores para 5.2+ pero el método para agregar nuevas etiquetas es torpe, y se actualizó por última vez en 2008.

Enterrado en la cuarta página de una búsqueda de Bing (me estaba desesperando) encontré jBBCode , que parece nuevo y requiere PHP 5.3. MIT Lisence. Todavía tengo que intentar crear etiquetas personalizadas, pero hasta ahora es la única que he probado que funciona de forma inmediata en una cuenta de alojamiento compartido con PHP 5.3.

  

Respondiendo a: " ¿Alguna idea mejor? " (y supongo que fue una invitación no solo para mejorar las sugerencias específicas de bbcode)

Recientemente vimos la ruta bbcode y decidimos usar htmlpurifier . Esta decisión se basó en parte en las comparaciones (probablemente sesgadas) entre varios métodos enumerados por el grupo htmlpurifier aquí y la discusión de bbcode (nuevamente, por el grupo htmlpurifer) aquí

Y para que conste, creo que tu inglés era muy bueno. Estoy seguro de que es mucho mejor de lo que podría hacer en su idioma nativo.

Use preg_split() con la bandera PREG_DELIM_CAPTURE para dividir el código fuente en etiquetas y no etiquetas. Luego, repita las etiquetas manteniendo la pila de bloques abiertos (es decir, cuando vea la etiqueta de apertura, agréguela a una matriz. Cuando vea la etiqueta de cierre, elimine los elementos del final de la matriz hasta que la etiqueta de cierre coincida con la etiqueta de apertura).

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