BBCode to XHTML: due possibilità, una regex?
Domanda
Sto scrivendo un piccolo modulo blog. Voglio che gli utenti siano in grado di digitare BBCode. Devo convertirlo in XHTML per archiviarlo nel DB, cosa che sono riuscito a fare per la maggior parte dei tag, ad eccezione di [url]
.
Ci sono due casi che voglio consentire:
[url=http://stackoverflow.com/]
che dovrebbe essere convertito in
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
e
[url=http://stackoverflow.com/]StackOverflow[/url]
che dovrebbe essere convertito in
<a href="http://www.stackoverflow.com" title="StackOverflow">StackOverflow</a>
Purtroppo, non sono stato in grado di farlo. I risultati sono stati orribili e mi chiedo se ciò possa essere fatto in un'unica regex o se debba essere diviso in due.
Soluzione
Questo dovrebbe funzionare:
\[url\s*=\s*([^\]]*)]\s*((?:(?!\s*\[/url\]).)*)\s*\[/url\]|\[url\s*=\s*([^\]]*)]
Schema di sostituzione:
<a href="$1$3" title="$2">$2$3</a>
Testato con questo input:
bla [url=http://stackoverflow.com/]StackOverflow[/url] bla
bla [url=http://stackoverflow.com/] bla
Returns:
bla <a href="http://stackoverflow.com/" title="StackOverflow">StackOverflow</a> bla
bla <a href="http://stackoverflow.com/" title="">http://stackoverflow.com/</a> bla
Si noti che in ogni caso potrebbe essere necessario aggiungere un po 'di convalida / escape, poiché i caratteri XML non validi (" ;, < ;, > ecc.) possono " break " il contenuto del tag.
Altri suggerimenti
Qualcosa come questo lavoro orribile dovrebbe farlo:
\[url=([^\]]+)\](?:([^\[]+)\[\/url\])?
Al momento della corrispondenza, questo dovrebbe inserire l'URL in $ 1 e il testo in $ 2 se è stato specificato. Non l'ho ancora testato, quindi potrebbe richiedere qualche modifica.
Analizza la funzione BBCode2HTML ($ text)
https://code.google. com / p / pwision / source / browse / trunk / inc / BBCode.inc # 150
L'algoritmo per trasformare l'HTML di BBCode 2 è: 1) regola il testo del BBCode codice qui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#60
2) trasforma il BBCode regolamentato in XML codice qui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#101
3) esegui una trasformazione XSLT nel testo XML. Il file XSLT è qui https://code.google.com/p/pwision /source/browse/trunk/inc/BBCodeXML2HTML.xslt La trasformazione viene eseguita qui: https://code.google.com/p /pwision/source/browse/trunk/inc/BBCode.inc#113
Spero di averti aiutato!
PS: un buon tutorial XSLT che puoi trovare qui: http://www.w3schools.com/xsl/xsl_languages.asp