Visualizzazione risultati 1 fino 10 di 10

Discussione: Aiuto funzione per interpretare BBCode

  1. #1
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito Aiuto funzione per interpretare BBCode

    Ho appena realizzato questa funzione, ovviamente non finita, per interpretare il BBCode:

    Codice PHP:
    function BBCode($text)
    {
    $bb = array(
    "#\[b\](.*?)\[/b\]#",
    "#\[i\](.*?)\[/i\]#",
    "#\[u\](.*?)\[/u\]#",
    "#\[left\](.*?)\[/left\]#",
    "#\[center\](.*?)\[/center\]#",
    "#\[right\](.*?)\[/right\]#",
    "#\[code\](.*?)\[/code\]#"
    );

    $html = array(
    "<b>$1</b>",
    "<i>$1</i>",
    "<u>$1</u>",
    "<div align=\"left\">$1</div>",
    "<div align=\"center\">$1</div>",
    "<div align=\"right\">$1</div>",
    "<code>$1</code>"
    );

    return
    preg_replace($bb, $html, $text);
    }
    Il testo che mi dovrebbe interpretare è scritto in una textarea il cui contenuto viene passato ad una variabile $text in questo modo:

    Codice PHP:
    $text = nl2br(htmlspecialchars(contenuto_textarea));
    Per poi essere salvato nel database.

    Successivamente, quando viene recuperato e passato alla funzione qui sopra, per poi essere stampato, in effetti il BBCode mi viene interpretato, ma solamente ad una condizione, ovvero ché: il testo, all'interno del BBCode, sia scritto tutto su una riga.

    Cioè, se scrivo ad esempio [ code ] Ciao [/ code ] ( scrivo staccato per non farmelo interpretare dal forum ), lo script me lo interpreta perfettamente, ma se, all'interno della textarea scrivo:

    Codice:
    [ code ] Ciao
    ciao [/ code ]
    Portando il testo a capo, non me lo interpreta più.

    Non so se mi sono spiegato bene, ma come mai mi accade ciò?

    EDIT:

    Credo che il problema sia nel punto, nell'espressione regolare, non ricordavo che quest'ultimo non comprendesse un a capo, scusate ma non me la cavo tanto bene con le espressioni regolari, cmq, sto provando a cercare un modo per dare valido qualsiasi carattere ( sia un carattere di spaziatura, numero, un a capo, ecc.. ), ma non riesco, come potrei sostituire l'espressione regolare?
    Ultima modifica di sevenjeak : 26-02-2012 alle ore 11.24.51

    Sevenjeak
    Software developer and much more

  2. #2
    Guest

    Predefinito

    Devi aggiungere il modificatore s alla fine dell'espressione per avere il support multiline.

    Ne hai una lista completa qui: preg_replace() #89364.


  3. #3
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Ok, infatti modificando l'array $bb, in questo modo:

    Codice PHP:
    $bb = array(
    "/\[b\](.*?)\[\/b\]/s",
    "/\[i\](.*?)\[\/i\]/s",
    "/\[u\](.*?)\[\/u\]/s",
    "/\[left\](.*?)\[\/left\]/s",
    "/\[center\](.*?)\[\/center\]/s",
    "/\[right\](.*?)\[\/right\]/s",
    "/\[code\](.*?)\[\/code\]/s"
    );
    Funziona come vorrei io, grazie per l'aiuto.

    Sevenjeak
    Software developer and much more

  4. #4
    Guest

    Predefinito

    Ti consiglio di inserire anche il modificatore /i per avere la regola case-insensitive e /U per avee il supporto unicode.


  5. #5
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Sapevo del modificatore /i, ma non conoscevo il modificatore /u, se non sbaglio serve a codificare un set elevato di carattere vero?

    Sevenjeak
    Software developer and much more

  6. #6
    Guest

    Predefinito

    Aspetta, sto confondendo

    Per il supporto unicode (UTF-8), il modificatore è /u, mentre /U è quello ungreedy, che se non ricordo male, indicare la recursione del pattern per un numero indefinito di volte, ma non ne sono sicuro.


  7. #7
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Ok, creato di aver capito, in ogni caso cerco di vedere meglio su internet, grazie.

    Sevenjeak
    Software developer and much more

  8. #8
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Citazione Originalmente inviato da biccheddu Visualizza messaggio
    [...] mentre /U è quello ungreedy, che se non ricordo male, indicare la recursione del pattern per un numero indefinito di volte, ma non ne sono sicuro.

    Nah!
    Ungreedy, tradotto in italiano vuol dire non ingordo.
    È un modificatore che, volendo spiegare semplicemente, aggiunge ad ogni quantificatore (*, +, ?) un ulteriore ? in modo tale da recuperare da una stringa quanto meno possibile.

    Faccio un esempio:
    Codice PHP:
    $str = "ciao *prova *testo*";

    echo
    preg_replace("/\*(.+)\*/U", "<b>\\1</b>", $str); // ciao <b>prova</b> testo*

    echo preg_replace("/\*(.+)\*/", "<b>\\1</b>", $str); // ciao <b>prova *testo</b>
    Con il modificatore U, la regexp si è fermata alla prima occorrenza dell'asterisco, trasformando in grassetto solo "prova "; mentre senza modificatore, la regexp ha preso tutto ciò che le era possibile prendere.

    Non mi ritengo "adeguato" a fare degli esempi ma spero sia chiaro .
    In rete credo ci sia di meglio.

  9. #9
    Guest

    Predefinito

    Grazie mille, ora è più chiaro.


  10. #10
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,769

    Predefinito

    Ok, grazie.

    Sevenjeak
    Software developer and much more

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •