php cakephp bbcode sablecc

php - La mejor forma de analizar bbcode



cakephp sablecc (5)

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

Recientemente miramos ir a la ruta bbcode y decidimos usar htmlpurifier en su lugar. Esta decisión se basó en parte en las comparaciones (probablemente parciales) entre varios métodos enumerados por el grupo htmlpurifier aquí y la discusión de bbcode (una vez más, por el grupo htmlpurifer) aquí

Y para el registro, creo que tu inglés fue muy bueno. Estoy seguro de que es mucho mejor de lo que podría hacer en tu lengua materna.

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

Bbcodes 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]

Bbcodes podría tener comportamientos múltiples.

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

Creo que cubre la mayoría de mis necesidades. Ya he hecho 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 expresión regular para los parámetros, no coincidía correctamente con el código bb anidado.

"/[($tag)(=.*)/"/](.*)/[///1/]" // No lo era. * pero el matcher no gready

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

Entonces, ¿hay alguna forma de unir 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, por lo que si el texto de entrada no No tiene código bb 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 mejor idea? o cualquier cosa que pueda conducir a un analizador eficiente de bbcode flexible?

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


Hay una biblioteca de análisis PeC y PEAR BBCode. El software es lo suficientemente difícil sin reinventar años de trabajo por su cuenta.

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

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

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

  3. No te olvides de dar cuenta de los dos puntos en casos como [nombre de la etiqueta:

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


Hay varias bibliotecas existentes para analizar BBCode, puede ser más fácil buscarlas que intentar hacerlas por su cuenta:

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


Utilice preg_split() con el indicador PREG_DELIM_CAPTURE para dividir el código fuente en etiquetas y no etiquetas. Luego itere sobre 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 extremo de la matriz hasta que la etiqueta de cierre coincida con la etiqueta de apertura).


He estado buscando analizadores de bbcode yo mismo. La mayoría usa expresiones regulares y PHP4 y produce errores en PHP 5.2+ o no funciona en absoluto. PECL bbcode y PEAR HTML_BBCodeParser no parecen mantenerse más (a finales de 2012) y no se instalan fácilmente en la configuración de alojamiento compartido con la 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 fue actualizado por última vez en 2008.

Enterrado en la 4ª página de una búsqueda de Bing (me estaba desesperando) encontré jBBCode , que parece nuevo y requiere PHP 5.3. MIT Lisence. Aún no he intentado crear etiquetas personalizadas, pero hasta ahora es la única que he probado que funciona de la caja en una cuenta de hosting compartido con PHP 5.3.