BBCode a XHTML: ¿Dos posibilidades, una expresión regular?
Pregunta
Estoy escribiendo un pequeño módulo de blog. Quiero que los usuarios puedan escribir BBCode. Necesito convertir eso a XHTML para almacenarlo en la base de datos, lo que logré hacer para la mayoría de las etiquetas, excepto [url]
.
Hay dos casos que quiero permitir:
[url=http://stackoverflow.com/]
que debe convertirse a
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
y
[url=http://stackoverflow.com/]StackOverflow[/url]
que debe convertirse a
<a href="http://www.stackoverflow.com" title="StackOverflow">StackOverflow</a>
Lamentablemente, no he podido hacer eso. Los resultados fueron horribles, y me pregunto si esto podría hacerse en una expresión regular o si debe dividirse en dos.
Solución
Esto debería funcionar:
\[url\s*=\s*([^\]]*)]\s*((?:(?!\s*\[/url\]).)*)\s*\[/url\]|\[url\s*=\s*([^\]]*)]
Patrón de reemplazo:
<a href="$1$3" title="$2">$2$3</a>
Probado con esta entrada:
bla [url=http://stackoverflow.com/]StackOverflow[/url] bla
bla [url=http://stackoverflow.com/] bla
Devoluciones:
bla <a href="http://stackoverflow.com/" title="StackOverflow">StackOverflow</a> bla
bla <a href="http://stackoverflow.com/" title="">http://stackoverflow.com/</a> bla
Tenga en cuenta que, en cualquier caso, es posible que deba agregar alguna validación / escape, ya que los caracteres XML no válidos (" ;, < ;, > etc.) pueden " break " el contenido de la etiqueta.
Otros consejos
Algo así como este horrible trabajo debería hacerlo:
\[url=([^\]]+)\](?:([^\[]+)\[\/url\])?
Al hacer coincidir, esto debería colocar la url en $ 1 y el texto en $ 2 si se ha especificado. Todavía no probé esto, por lo que podría requerir algunos ajustes.
Función de análisis BBCode2HTML ($ text)
https://code.google. com / p / pwision / source / browse / trunk / inc / BBCode.inc # 150
El algoritmo para transformar HTML de BBCode 2 es: 1) regular el texto de BBCode código aquí: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#60
2) transforma el código BBCode regulado a XML código aquí: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#101
3) ejecute una transformación XSLT al texto XML. El archivo XSLT está aquí. https://code.google.com/p/pwision /source/browse/trunk/inc/BBCodeXML2HTML.xslt La transformación se realiza aquí: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#113
¡Espero haber ayudado!
PD: un buen tutorial de XSLT que puedes encontrar aquí: http://www.w3schools.com/xsl/xsl_languages.asp