Domanda

Mi piacerebbe lavorare su un filtro bbcode per un sito Web php. (Sto usando cakephp, sarebbe un aiuto bbcode) Ho qualche requisito.

I codici Bb possono essere nidificati. Quindi qualcosa di simile è valido.

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

I codici Bb possono avere 0 o più parametri.

Esempio:

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

I codici B potrebbero avere comportamenti multipli.

Diciamo che [url]text[/url] verrebbe trasformato in [url:url="text"]text[/url] o il video bbcode sarebbe in grado di scegliere tra youtube, dailymotion ....

Penso che copra la maggior parte delle mie esigenze. Alreay ho fatto qualcosa con regex. Ma il mio problema più grande era quello di abbinare i parametri. In effetti, ho ottenuto bbcode nidificato per funzionare e bbcode con 0 parametri. Ma quando ho aggiunto una corrispondenza regex per i parametri non corrispondeva correttamente al bbcode nidificato.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // Non è stato. * ma il non-matcher

Non ho la regex completa con me in questo momento, ma avevo qualcosa di simile (sopra).

Quindi c'è un modo per abbinare efficacemente bbcode a regex o qualcos'altro. L'unica cosa che mi viene in mente è usare il modello visitatore e dividere il mio testo con ogni possibile tag in questo modo, posso avere un po 'più di controllo sul mio analisi del testo e probabilmente potrei convalidare il mio documento, quindi se il testo di input non lo fa avere un codice bb valido. Potrei avvisare l'utente con un errore prima di salvare qualcosa.

Userei sablecc per creare il mio parser di testo. http://sablecc.org/

Qualche idea migliore? o qualsiasi altra cosa che possa portare ad un efficiente parser bbcode flessibile?

Grazie e scusa per il mio cattivo inglese ...

È stato utile?

Soluzione

Esistono sia pecl che PEAR libreria di analisi BBCode. Il software è abbastanza difficile senza reinventare anni di lavoro da soli.

Se nessuna di queste è un'opzione, mi concentrerei a trasformare il BBCode in una stringa XML valida e quindi a utilizzare la tua routine di analisi XML preferita. Un'idea molto approssimativa qui, ma

  1. Esegui il codice tramite htmlspecialchars per sfuggire a qualsiasi entità che necessiti di uscire

  2. Trasforma tutti i caratteri [e] in < e > rispettivamente

  3. Non dimenticare di tenere conto dei due punti in casi come [tagname:

Se il BBCode è stato nidificato correttamente, dovresti essere pronto per passare questa stringa in un oggetto di analisi XML (SimpleXML, DOMDocument, ecc.)

Altri suggerimenti

Esistono diverse librerie esistenti per l'analisi di BBCode, potrebbe essere più facile esaminarle piuttosto che provare a creare il tuo:

Eccone un paio, sono sicuro che ce ne sono altri se ti guardi intorno:
bbcode PECL
PEAR HTML_BBCodeParser

Ho esaminato personalmente i parser bbcode. Molti di loro usano regex e PHP4 e producono errori su PHP 5.2+ o non funzionano affatto. PECL bbcode e PEAR HTML_BBCodeParser non sembrano più essere mantenuti (fine 2012) e non sono facilmente installabili sulla configurazione di hosting condiviso con cui devo lavorare. StringParser_BBCode funziona con alcune piccole modifiche per la versione 5.2+ ma il metodo per l'aggiunta di nuovi tag è goffa ed è stata aggiornata l'ultima volta nel 2008.

Sepolto nella quarta pagina di una ricerca di Bing (stavo diventando disperato) ho trovato jBBCode , che appare nuovo e richiede PHP 5.3. MIT Lisence. Devo ancora provare a creare tag personalizzati, ma finora è l'unico che ho provato a funzionare subito su un account di hosting condiviso con PHP 5.3.

  

Risposta a: " Qualche idea migliore? " (e presumo che questo sia stato un invito non solo per il miglioramento rispetto ai suggerimenti specifici per bbcode)

Di recente abbiamo esaminato il percorso di bbcode e abbiamo deciso di utilizzare invece htmlpurifier . Questa decisione si basava in parte sul confronto (probabilmente di parte probabilmente) tra i vari metodi elencati dal gruppo htmlpurifier qui e la discussione di bbcode (di nuovo, da parte del gruppo htmlpurifer) qui

E per la cronaca penso che il tuo inglese fosse molto buono. Sono sicuro che è molto meglio di quanto potrei fare nella tua lingua madre.

Usa preg_split() con PREG_DELIM_CAPTURE flag per dividere il codice sorgente in tag e non tag. Quindi scorrere i tag mantenendo la pila di blocchi aperti (ovvero quando vedi il tag di apertura, aggiungilo a un array. Quando vedi il tag di chiusura, rimuovi gli elementi dalla fine dell'array fino a quando il tag di chiusura corrisponde al tag di apertura.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top