• Super User

    Tag <br />

    Salve, ho un problema.

    In pratica sto sviluppando un sistema di messaggi privati. Il problema è che non so come gestire le spaziature. In pratica funziona così.

    Nella pagina A c'è una textarea dove si scrive il messaggio e si preme "Invia" per mandarlo.

    Nella pagina B c'è un codice php/query mysql che prende il messaggio e lo visualizza.

    Il problema con le spaziature è che perchè la formattazione venga visualizzata correttamente nella pagina B bisogna mettere il tag <br />, altrimenti viene visualizzato tutto come un continuo. Però nella pagina A all'interno della textera si legge il tag <br /> (esempio: ciao,<br /> come stai?<br />io bene!). Come faccio per non visualizzare i <br /> nella pagina A ma mantenere comunque le spaziature? :mmm:

    Un'altra cosa. Io vorrei abilitare solo alcuni tags html (tipo <b>, <i>, <u>, <p>,) e bloccare gli altri con strip_tags. Il problema è che se qualcuno si "dimentica" di chiudere un tag si estende a tutta la pagina :arrabbiato: come faccio a impostare la "chiusura automatica" dei tag con php?
    max


  • Consiglio Direttivo

    Ciao max0005. 🙂

    Tempo addietro una delle mie prime esperienze da phista fai da te (non che ora sia migliorato, intendiamoci :2: è stata proprio quella di creare un qualcosa del genere, se può servirti ti propongo come affrontai all'epoca la questione, anche grazie all'aiuto del mio tutor (leggasi: colui a cui le ho frantumate fino all'esaurimento ;)).

    Per il discorso dell'a capo, essendo il testo memorizzato così:

    testo testo testo\n
    testo testo testo\n
    testo testo testo\n
    testo testo testo\n
    ```Dove \n è il carattere di *nuova linea,* ti basta sostituirlo con <br /> facendo un replace, all'atto della visualizzazione del testo.
    Ovvero, tu avrai qualcosa del genere per visualizzare il messaggio:
    [php]echo $testo;[/php]Poni prima di questo uno str_replace e visualizzerai il tutto correttamente. ;)
    [php]$testo=str_replace('\n', '<br />', $testo);
    echo $testo;[/php]Per quanto concerne le formattazioni testo ti consiglierei invece di utilizzare il concetto dei BBCode, dato che non è mai cosa buona lasciar inserire tags html, quindi non escludere alcun tags o altro dalla rimozione (immagino tu abbia anche reso *innocui* caratteri come apici, doppi apici e altro).
    Invece di far inserire agli utenti il classico < b>testo< /b>, farai inserire [B ]Testo[/ B].
    Sempre all'atto della visualizzazione provvederai a rimpiazzare tramite str_replace i vari tags:
    [php]$testo=str_replace('**', '< b>', $testo);
    $testo=str_replace('**', '</b>', $testo);[/php]Volendo puoi anche memorizzare i tags su due array per non dover ripetere le stesse stringhe più volte e fare un replace unico.
    
    Una soluzione diversa potrebbe essere invece quella di associare un editor come tinymce alla textarea, così da salvarti il tutto sul Db già depurato e come a te serve (sempre meglio metter dei controlli comunque) e dare all'utente un'interfaccia più carina, permettendogli di fare solo ciò che tu vuoi che possa fare con le formattazioni testo. Per capirci un editor impostato come quello della risposta rapida quì nel forum, ma anche più minimal. ;)

  • Super User

    Grazie Samyorn proverò 😄

    Una domanda... qual'è la differenza fra usare il bbcode e usare poi str_replace o far inserire direttamente dei codici html? max

    UPDATE:
    Funziona 😄

    Per la seconda domanda, ovvero come posso impostare la chiusura automatica dei tags/bbcode... come poso fare?

    PS: Si potrei facilmente installare un editor però lo scopo di questo mio progetto è migliorare le mie capacità con php/mysql quindi preferisco evitare soluzioni da "drag, drop, works" 🙂


  • Consiglio Direttivo

    Non sono un esperto di sicurezza, ma ovunque tu vada a leggere non è mai consigliabile permettere di far maneggiare tags HTML a script e Database, soprattutto se chiunque può inserirli. Utilizzando il sistema BBcode, che viene sfruttato come puoi vedere anche su questo forum, fai maneggiare dell'innocuo testo ai tuoi script. [B ] e [/ B], per gli script e per il Db son solo testo, all'atto della visualizzazione, e solo allora, li rimpiazzerai con quanto ti serve per una corretta visualizzazione HTML. :).
    L'utilizzo di tags HTML potrebbe sfociare in buchi non irrilevanti, a discapito della sicurezza del tuo sistema. 🙂


  • ModSenior

    Ciao max0005,

    Per quanto riguarda la chiusura guarda qui (L'esempio usa BBCODE).
    Per quanto riguarda i bbcode oppure i tag html, direi che l'unica differenza rilevante sta nella facilità di controllo e per inserire nuovi bbcode (Sistema molto usato nei browsergame dove troviamo altri bbcode come ad esempio [player],[village],ecc).
    I tag html devono per l'appunto essere filtrati, per evitare di mettere ad esempio redirect javascript.


  • Consiglio Direttivo

    M'ero perso l'UPDATE, max. 😄

    Grazie infinite Thedarkita, ottima risorsa, spostata in area idonea. 😉


  • Super User

    Ho provato a usare uno script simile a quello che tu mi hai indicato (nel senso che ho solo modificato/aggiunto tag :D) ma mi da questo errore:

    Parse error: parse error in C:\xampp\htdocs\nfs\sendpm.php on line **44

    **[php]
    $pre_message = mysql_real_escape_string($_REQUEST["message"]);

    function bbcode_format($var) {
    $search = array(
    ?/(.*?)/is?, //<-- riga 44
    ?/(.?)/is?,
    ?/
    (.?)/is?,
    ?//is?,
    ?/(.?)/is?,
    ?/(.
    ?)/is?
    );
    $replace = array(
    ?<strong>$1</strong>?,
    ?<em>$1</em>?,
    ?<u>$1</u>?,
    ?<img src="$1" />?,
    ?<a href="$1">$1</a>?,
    ?<a href="$1">$2</a>?
    );
    $var = preg_replace ($search, $replace, $var);
    return $var;
    }

    $message = str_replace('\n', '', var);
    [/php]


  • Consiglio Direttivo

    La funzione per i bbcode andrà utilizzata in visualizzazione, mi sembra di capire che tu l'abbia messa nel file che invia i dati al Db invece.
    Ti conviene mettere la funzione in un file a parte e includerlo tramite require_once.

    Quando estrai i dati per visualizzarli farai semplicemente questo:
    [php]$message=bbcode_format($message);[/php]A questo punto puoi anche inserire la variazione da \n a <br /> direttamente in quella funzione:
    [php]function bbcode_format($var) {
    $search = array(
    '/(.*?)/is', //<-- riga 44
    '/(.?)/is',
    '/
    (.?)/is',
    '//is',
    '/(.*?)/is',
    '\n'
    );
    $replace = array(
    '<strong>$1</strong>',
    '<em>$1</em>',
    '<u>$1</u>',
    '<img src="$1" />',
    '<a href="$1">$1</a>',
    '<br />'
    );
    $var = preg_replace ($search, $replace, $var);
    return $var;
    } [/php]Credo che così dovrebbe andare. 😉

    P.S. ti ho tolto una delle modifiche dato che le hai rese identiche e quindi inutile duplicarle. 😉


  • Super User

    Ciao,
    visto che sto usando il codice nel filme che mette i dati nel mysql ho invertito le due parti:

    [php]
    $to = mysql_real_escape_string(strip_tags($_REQUEST["to"]));
    $subject = mysql_real_escape_string(strip_tags($_REQUEST["subject"]));
    $pre_message = mysql_real_escape_string($_REQUEST["message"]);

    function bbcode_format($var) {
    $search = array(
    '<strong>$1</strong>',
    '<em>$1</em>',
    '<u>$1</u>',
    '<img src="$1" />',
    '<a href="$1">$1</a>',
    '<br />'
    );
    $replace = array(
    '/(.*?)/is', //<-- riga 44
    '/(.?)/is',
    '/
    (.?)/is',
    '//is',
    '/(.*?)/is',
    '\n'
    );
    $var = preg_replace ($search, $replace, $var); //<-- riga 59
    return $var;
    }

    $message_a = str_replace('\n', '', $pre_message);
    $message_b=bbcode_format($message_a);
    $message = strip_tags($message_b);
    [/php]

    però mi da

    Warning: preg_replace() [function.preg-replace]: Unknown modifier '$' in C:\xampp\htdocs\nfs\sendpm.php on line 59


  • ModSenior

    Devi invertire pure $1 con (.*?).
    Però che senso ha convertire l'html in bbcode? Dovresti convertirlo nuovamente per utilizzarli...


  • Super User

    Ora che mi ci fai pensare... hai ragione... per qualche ragione ho pensato di far inserire tag html, convertirli in bbcode e poi convertire il bbcode in html... fare php per lunghi periodi fa MALE 😮

    UPDATE: il mio codice in un file esterno richiamato poi con require_once:

    [php]
    <?php

    function bbcode_format($var) {
    $search = array(
    '',
    '',
    '
    ',
    '',
    '',
    '\n',
    '[:)]',
    '[O:)]',
    '[:@]',
    '[:S]',
    '[:
    (]',
    '[£:)]',
    '[:$]',
    '[:O]',
    '[:(]',
    '[8)]',
    '[:D]',
    '[:P]',
    '
    ',
    '[;)]'
    );
    $replace = array(
    '<strong>(.
    ?)</strong>',
    '<em>(.
    ?)</em>',
    '<u>(.?)</u>',
    '<img src="(.
    ?)" />',
    '<a href="(.*?)">$1</a>',
    '<br />',
    '<img src="img/smile/smile1.gif">',
    '<img src="img/smile/smile2.gif">',
    '<img src="img/smile/smile3.gif">',
    '<img src="img/smile/smile4.gif">',
    '<img src="img/smile/smile5.gif">',
    '<img src="img/smile/smile6.gif">',
    '<img src="img/smile/smile7.gif">',
    '<img src="img/smile/smile8.gif">',
    '<img src="img/smile/smile9.gif">',
    '<img src="img/smile/smile10.gif">',
    '<img src="img/smile/smile11.gif">',
    '<img src="img/smile/smile12.gif">',
    '<img src="img/smile/smile13.gif">',
    '<img src="img/smile/smile14.gif">'
    );
    $var = preg_replace ($search, $replace, $var);
    return $var;
    }

    ?>
    [/php]

    L'errore:
    Warning: preg_replace() [function.preg-replace]: Unknown modifier '[' in C:\xampp\htdocs\nfs\bbc.php on line **48

    :arrabbiato:
    **


  • ModSenior

    Prova cosi:
    [php]
    <?php

    function bbcode_format($var) {
    $search = array(
    '/[b](.?)[/b]/is',
    '/[i](.
    ?)[/i]/is',
    '/[u](.?)[/u]/is',
    '/[img](.
    ?)[/img]/is',
    '/[url](.?)[/url]/is',
    '',
    '\n',
    '[:)]',
    '[O:)]',
    '[:@]',
    '[:S]',
    '[:
    (]',
    '[£:)]',
    '[:$]',
    '[:O]',
    '[:(]',
    '[8)]',
    '[:D]',
    '[:P]',
    '',
    '[;)]'
    );
    $replace = array(
    '<strong>(.
    ?)</strong>',
    '<em>(.?)</em>',
    '<u>(.
    ?)</u>',
    '<img src="(.?)" />',
    '<a href="(.
    ?)">$1</a>',
    '<br />',
    '<img src="img/smile/smile1.gif">',
    '<img src="img/smile/smile2.gif">',
    '<img src="img/smile/smile3.gif">',
    '<img src="img/smile/smile4.gif">',
    '<img src="img/smile/smile5.gif">',
    '<img src="img/smile/smile6.gif">',
    '<img src="img/smile/smile7.gif">',
    '<img src="img/smile/smile8.gif">',
    '<img src="img/smile/smile9.gif">',
    '<img src="img/smile/smile10.gif">',
    '<img src="img/smile/smile11.gif">',
    '<img src="img/smile/smile12.gif">',
    '<img src="img/smile/smile13.gif">',
    '<img src="img/smile/smile14.gif">'
    );
    $var = preg_replace ($search, $replace, $var);
    return $var;
    }

    ?>
    [/php]


  • ModSenior

    Ho provato io e da errore, la soluzione definitiva dovrebbe essere questa:
    [php]
    function bbcode_format($var) {
    $search = array(
    "/[b](.?)[/b]/is",
    "/[i](.
    ?)[/i]/is",
    "/[u](.?)[/u]/is",
    "/[img](.
    ?)[/img]/is",
    "/[url](.?)[/url]/is",
    '/\n/',
    '/[:)]/',
    '/[O:)]/',
    '/[:@]/',
    '/[:S]/',
    '/[:
    (]/',
    '/[£:)]/',
    '/[:$]/',
    '/[:O]/',
    '/[:(]/',
    '/[8)]/',
    '/[:D]/',
    '/[:P]/',
    '/*/',
    '/[;)]/'
    );
    $replace = array(
    '<strong>$1</strong>',
    "<em>$1</em>",
    "<u>$1</u>",
    '<img src="$1" />',
    '<a href="$1">$1</a>',
    '<br />',
    '<img src="img/smile/smile1.gif">',
    '<img src="img/smile/smile2.gif">',
    '<img src="img/smile/smile3.gif">',
    '<img src="img/smile/smile4.gif">',
    '<img src="img/smile/smile5.gif">',
    '<img src="img/smile/smile6.gif">',
    '<img src="img/smile/smile7.gif">',
    '<img src="img/smile/smile8.gif">',
    '<img src="img/smile/smile9.gif">',
    '<img src="img/smile/smile10.gif">',
    '<img src="img/smile/smile11.gif">',
    '<img src="img/smile/smile12.gif">',
    '<img src="img/smile/smile13.gif">',
    '<img src="img/smile/smile14.gif">'
    );
    $var = preg_replace($search, $replace, $var);
    return $var;
    }
    [/php]


  • Super User

    Grazie thedarkita 😄

    la parte relativa alla formattazzione del testo funziona. Però ho dei problemi con gli smilies 😞 Ad esempio basta che io nel testo inserisca una 'S', che lo interpreta come [:S] e lo traduca nella corrispondente immagine.

    Ad esempio mettendo [:D]

    Il risultato è l'equivalente di:

    [:):D]

    Possibili soluzioni? :mmm:
    max

    PS: Credo (basato esclusivamente su un'opinione personale) che allo script basti UN elemento in comune (eg: in [:S] basta che trovi una 'S' perchè converta l'immagine). Cosa ne pensi?


  • ModSenior

    A via di mettere / e \ sto impazzendo. 😄
    Un paio li ho sistemati, gli altri sto impazzendo... Fai prima a fare un str_replace per le faccine invece che fare le espressioni regolari inutilmente secondo me.

    [php]
    function bbcode_format($var) {
    $search = array(
    "/[b](.?)[/b]/is",
    "/[i](.
    ?)[/i]/is",
    "/[u](.?)[/u]/is",
    "/[img](.
    ?)[/img]/is",
    "/[url](.?)[/url]/is",
    '/\n/',
    "/[:)]/",
    "/[\O:)]/",
    "/[:@]/",
    "/[:S]/",
    "/[:
    ]/",
    "/[\£:)]/",
    "/[:$]/",
    "/[:O]/",
    "/[;)]/",
    "/[:(]/"
    );
    $replace = array(
    '<strong>$1</strong>',
    "<em>$1</em>",
    "<u>$1</u>",
    '<img src="$1" />',
    '<a href="$1">$1</a>',
    '<br />',
    '<img src="img/smile/smile1.gif">',
    '<img src="img/smile/smile2.gif">',
    '<img src="img/smile/smile3.gif">',
    '<img src="img/smile/smile4.gif">',
    '<img src="img/smile/smile5.gif">',
    '<img src="img/smile/smile6.gif">',
    '<img src="img/smile/smile7.gif">',
    '<img src="img/smile/smile8.gif">',
    '<img src="img/smile/smile9.gif">',
    '<img src="img/smile/smile10.gif">'
    );
    $var = preg_replace($search, $replace, $var);
    return $var;
    }
    [/php]


  • Super User

    Grazie mille 😄


  • ModSenior

    Vedi che mancano 4 faccine però...
    Perchè una non sono riuscito a farla andare.
    Ti consiglio comunque di fare un str_replace per le faccine, che sicuramente è molto più comodo.


  • Super User

    Si ho usato uno str_replace e funziona 😄

    Ho ancora un dubbio... in pratica avrei bisogno che continuasse la ricerca di bbcode da rimpiazzare anche all'interno degli stessi... esempio:

    
    [table] [table] [/table] [/table]
    
    ```dove il codice '[table]' è (per esempio):
    
    

    <table border="1">
    <tr>
    <td>

    </td>
    </tr>
    </table>

    
    

    <table border="1">
    <tr>
    <td>
    [table][/table]
    </td>
    </tr>
    </table>
    [/table]

    
    mentre io vorrei che fosse
    
    

    <table border="1">
    <tr>
    <td>

    <table border="1">
    <tr>
    <td>
    </td>
    </tr>
    </table>

    </td>
    </tr>
    </table>


  • ModSenior

    Il problema è che considera sempre la prima apertura e la prima chiusura che trova...
    Non mi viene niente in mente... :mmm:


  • Super User

    Il codice in questione:

    [php]
    "/[premsg](.*?)[/premsg]/is"
    [/php][php]
    '<table border="1" STYLE="border-style:none; font-size:12px" width="700"><tr bgcolor="FFCC99"><td>$1</td></tr></table>'
    [/php]eppure ci sono numerosi forum e cms che fanno uso di questo sistema di "tabella in tabella" per segnalare (ad esempio) quote di quote... mmh... :mmm:

    PS:

    Esempio di codice risultante da uso di [premsg] testo [premsg] altro testo[/premsg][/premsg]:

    
    <br /><table border="1" STYLE="border-style:none; font-size:12px" width="700"><tr bgcolor="FFCC99"><td>
    <br />____________________
    <br />max0005 wrote:
    <br />
    <br />sdfdddssd
    <br />
    <br />[premsg]
    <br />____________________
    <br />max0005 wrote:
    <br />
    <br />gaaamesgaaames</td></tr></table>[/premsg]