BBCode para XHTML: Duas possibilidades, um regex?
Pergunta
Eu estou escrevendo um pequeno módulo blog. Eu quero que os usuários sejam capazes de digitar BBCode. Eu preciso converter isso para XHTML para loja no DB, que eu consegui fazer para a maioria das marcas, exceto para [url]
.
Existem dois casos eu quero permitir que:
[url=http://stackoverflow.com/]
que deve ser convertido para
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
e
[url=http://stackoverflow.com/]StackOverflow[/url]
que deve ser convertido para
<a href="http://www.stackoverflow.com" title="StackOverflow">StackOverflow</a>
Infelizmente, eu fui incapaz de fazer isso. Os resultados foram horrível, e eu estou querendo saber se isso poderia ser feito em um regex ou se ele tem que ser dividido em dois.
Solução
Isso deve funcionar:
\[url\s*=\s*([^\]]*)]\s*((?:(?!\s*\[/url\]).)*)\s*\[/url\]|\[url\s*=\s*([^\]]*)]
padrão de substituição:
<a href="$1$3" title="$2">$2$3</a>
Testado com esta entrada:
bla [url=http://stackoverflow.com/]StackOverflow[/url] bla
bla [url=http://stackoverflow.com/] bla
Retorna:
bla <a href="http://stackoverflow.com/" title="StackOverflow">StackOverflow</a> bla
bla <a href="http://stackoverflow.com/" title="">http://stackoverflow.com/</a> bla
Note que, em qualquer caso, você pode ter que adicionar alguma validação / escapar, como caracteres inválidos XML (", <,> etc.) pode "quebrar" o conteúdo da tag.
Outras dicas
Algo como este pedaço medonho de trabalho deve fazê-lo:
\[url=([^\]]+)\](?:([^\[]+)\[\/url\])?
Ao correspondência, este deve colocar o URL em US $ 1 e o texto em $ 2 se tiver sido especificado. Eu não testei isso ainda por isso poderia exigir alguns ajustes.
analisar função BBCode2HTML ($ text)
https://code.google. com / p / pwision / fonte / browse / trunk / inc / BBCode.inc # 150
O algoritmo para transformar BBCode 2 HTML é: 1) regular o texto BBCode código aqui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#60
2) transformar o BBCode regulado para XML código aqui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#101
3) executar uma transformação XSLT ao texto XML. O arquivo XSLT é aqui https://code.google.com/p/pwision /source/browse/trunk/inc/BBCodeXML2HTML.xslt A transformação é feita aqui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#113
A esperança eu ajudei!
PS: um bom XSLT tutorial, você pode encontrar aqui: http://www.w3schools.com/xsl/xsl_languages.asp