Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 47
  1. #1

    [PILLOLA] a capo con nl2br

    Riprongo qui l'esperimento che ho fatto sul forum html quando lo frequentavo: LE PILLOLE.

    LE PILLOLE sono una sorta di mini tutorial in cui, qualche anima pia , decide di discutere degli argomenti più trattati in modo che i thread possano diventare utili per eventuali domande sullo stesso argomento.
    Non vuole essere in nessun modo un'occasione per mettersi in mostra (anche perchè io ho imparato ieri a fare i form in php e poi su questo forum siamo tutti amicici ) ma, più che altro, LE PILLOLE potrebbero diventare un punto di riferimento per tutti senza dover spiegare sempre le stesse cose.

    Chiunque può fare una pillola... non ci sono regole se non quella di andare un po' più a fondo del semplice COPIA/INCOLLA del codice... quindi: bubu 77, metallica, skidx, fabio, gm, caciara, boom boom e tutti gli altri fatevi sotto

    Dopo questa barbosa premessa ho deciso di iniziare con la pillola sul nl2br, ovvero andare a capo con INVIO anzichè con i
    .

    La funzione base è questa:

    $stringa = nl2br($stringa);

    Facciamo l'esempio di avere un form con una textarea chiama GM; vogliamo che il testo nella textarea abbia "gli a capo" automatici quando inseriremo i dati nel database.
    Per ottenere questo basterà inserire

    Codice PHP:
    $gm nl2br($gm); 
    poco prima della query INSERT oppure direttamente nel file config.inc se ne abbiamo uno. Tutti gli a capo verranno trasformati in
    (oppure
    se abbiamo una versione di php precedente alla 4.0.5; vedremo in seguito perchè sarà fondamentale la distinzione).

    Ok...teoricamente finisce tutto qui ma proprio da qui iniziano i problemi complementari. Questi problemi si dividono in due tronconi:

    1) caso in cui abbiamo un'amministrazione privata a cui accediamo solo noi
    2) caso in cui c'è un form in cui tutti gli utenti inseriranno del testo

    Nel primo caso sappiamo benissimo come comportarci: sapendo che il codice HTML è attivato non inseriremo mai una stringa di questo tipo
    codice:
    <script>alert('metallica ce l'ha piccolo');</script>
    Nel secondo caso invece dobbiamo prevenire i furbacchioni che, sicuramente, inserirebbero codice strano.

    Alcuni potrebbero dire: "EMBE'...usiamo la funzione htmlspecialchars che trasforma i caratteri più "pericolosi" (come <, ", ') nel rispettivo codice ascii."

    Ok...però così facendo, se non stiamo attenti, ci fottiamo la funzione nl2br; infatti i
    potrebbero essere trasformati in &lt;br /&gt;.

    Quindi la domanda è: "Come mantere nl2br pur evitando l'inserimento di caratteri bastardi?


    Due le soluzioni.
    Partiamo proprio dal secondo caso (quello dell'utilizzo della textare da parte di tutti)... che è il più lungo

    Io, solitamente, adotto questa soluzione (ma sicuramente c'è di meglio ):

    Codice PHP:
    $gm stripslashes($gm);
    $gm htmlspecialchars($gm);
    $gm nl2br($gm); 
    L'importante è l'ordine delle stringhe. htmlspecialchars deve stare prima di nl2br altrimenti va tutto a put°°°° . Oppure possiamo anche fare così:

    Codice PHP:
    $gm stripslashes($gm);
    $gm nl2br($gm);
    $gm htmlspecialchars($gm);
    $gm ereg_replace("&lt;br /&gt;","
    "
    ,$gm);
    $gm ereg_replace("&lt;br&gt;","
    "
    ,$gm); 
    Vediamo cosa abbiamo fatto.

    Nel primo esempio è semplice:

    1)abbiamo strippato tutti gli slash (e fin qui ci siamo)
    2)abbiamo sostituito tutti i caratteri potenzialmente dannosi con i caratteri ascii
    3)abbiamo messo gli a capo automatici che non vengono trasformati &gt;br /&lt; perchè dopo la funzione htmlspecialchars

    Il secondo caso è un po' più macchinoso ma è identico.

    1) abbiamo strippato tutti gli slash (e fin qui ci siamo)
    2) abbiamo messo la funzione per gli a capo automatici
    3) abbiamo sostituito tutti i caratteri potenzialmente dannosi con i caratteri ascii
    4) a questo punto, proprio per la funzione htmlspecialchars, abbiamo tutti i br che sono diventati &lt;br /&gt; ma così non ci facciamo niente perchè non verrebbero interpretati come codice html. Quindi utilizziamo la funzione ereg_replace per cambiare nuovamente i &lt;br /&gt; in
    .
    ho anche contemplato il caso dei &lt;br&gt; visto che non posso sapere che versione di php utilizzerà l'utente se metto a disposizione di tutti lo script.

    Adesso supponiamo che il nostro form, che va a finire nel database oppure in una pagina in cui viene mostrato il risultato, sia composto da una cifra spropositata di campi.
    Cosa si fa? teoricamente dovremmo ripetere quelle 5 righe con il nome di ogni campo; è una soluzione che funziona ma rischiamo di metterci una eternità.
    Allora una possibile soluzione è creare una funzioncina piccola piccola che risolverà tutto (magari da includere nel file config)

    Codice PHP:
    function bubu77 ($stringa){
    $stringa stripslashes($stringa);
    $stringa htmlspecialchars($stringa);
    $stringa nl2br($stringa);
    return 
    $stringa;


    Con questa funzione basterà una riga per applicare tutti vari nl2br etc etc al singolo campo.

    Torniamo all'esempio: abbiamo dieci campi a cui applicare la funzione; con il primo esempio abbiamo 5 righe per ogni campo.

    quindi 5 x 10 = 50. 50 righe da scrivere.

    Con l'utilizzo della funzione bubu77 invece ce ne bastano 10. Infatti basterà scrivere queste stringhe per applicare a tutti i campi la stessa formattazione:

    Codice PHP:
    $campo1 bubu77($campo1);
    $campo2 bubu77($campo2);
    $campo3 bubu77($campo3);
    $campo4 bubu77($campo4);
    e così via fino a 10 
    Ok... abbiamo risolto il problema del codice bastardo da parte degli utenti. Ma se l'utente vuole usare i tag [b], [i] ad esempio? Come facciamo?

    Semplice... utilizziamo il VB code (quello che usa il forum: al posto dei < e dei > si usano le [ e le ]).
    In fase di estrazione dei dati dal database, infatti, basterà fare un'altra funzione per trasformare i [*b] o i [*/b] inseriti dall'utente in e e così via. (ho messo un asterisco appositamente altrimenti il forum interpretava il vbcode)

    Ad esempio così:

    codice:
    function skidx($stringa){
    $stringa = ereg_replace("\[b\]","",$stringa);
    $stringa = ereg_replace("\[/b\]","",$stringa);
    return $stringa;
    }
    Per la verità, se proprio vogliamo essere precisi, questa righe potrebbero benissimo essere integrate nella funzione bubu77 che viene utilizzata prima dell'inserimento dei dati nel database; l'importante è che stiano dopo

    $stringa = htmlspecialchars($stringa);

    Quindi vedete voi:
    1) o create una funzione separata da utilizzare nella fase di estrazione
    2) oppure la integrate nella funzione bubu77 prima dell'inserimento dei dati

    Il caso dell'amministrazione in cui accediamo solo noi è più semplice.
    Le righe seguenti della funzione bubu77

    Codice PHP:
    $stringa htmlspecialchars($stringa);
    $stringa ereg_replace("&lt;br /&gt;","
    "
    ,$stringa);
    $stringa ereg_replace("&lt;br&gt;","
    "
    ,$stringa); 
    potrebbero non servirci. infatti sapendo che l'html è "attivo" saremmo abbastanza stupidi se inserissimo dei codice <script> o qualcosa del genere. in questo modo possiamo utilizzare tranquillamente i tag normali [b], [i] e così via.
    Se invece abbiamo l'esigenza di mostrare del codice ai visitatori senza che questo venga interpretato riutilizziamo tutto quello detto per il caso dell'inserimento da parte degli utenti. basterà crearci del VB code solo per noi.
    ad esempio possiamo mettere che [*b] corrisponda a [b] e così via.


    Prima di concludere analizziamo il caso di modifica dei dati. In questa fase estraiamo i dati dal db per modificarli.
    Se non facessimo nulla avremmo una situazione di questo tipo

    Una frase visualizzata a video così

    codice:
    l'altra sera
    ero a casa
    verrebbe restituita così in fase di editing

    codice:
    l&39;altra sera
    
    
    ero &lt;b&gt;a casa&lt;/b&gt;
    Insomma... un bel casino anche perchè facendo l'update della tabella i &lt;b&gt; verrebbero trasformati in [b] e quindi verrebbero interpretati.

    Quindi bisogna fare una doppia operazione:
    1) una in fase di estrazione dei dati per la modifica
    2) una in fase di update

    Per la prima fase dobbiamo eliminare i
    e trasformarli in uno spazio vuoto oltre a trasformare il codice ascii in html (tanto nella textarea non viene interpretato). quindi mettiamo una nuova funzione prima della query:

    Codice PHP:
    function bubu77_edita($stringa){
    $stringa stripslashes($stringa);
    $stringa ereg_replace("'","'",$stringa);
    $stringa ereg_replace("\r\n","",$stringa);
    $stringa ereg_replace("\n","",$stringa);
    $stringa ereg_replace("
    "
    ,"\n",$stringa);
    $stringa ereg_replace("&lt;","<",$stringa);
    $stringa ereg_replace("&gt;",">",$stringa);
    return 
    $stringa;

    e in fase di estrazione avremo finalmente

    codice:
    l'altra sera
    ero a casa
    Gli \r\n sono i carriage return che su UNIX/LINUX corrispondono proprio ad un A CAPO. Ho messo anche il singolo \n che è prerogativa di windows. Così facendo dovremmo essere a posto in tutti i casi indipendentemente dal sistema operativo.
    Se poi notiamo che qualcosa non va proviamo a levare

    $stringa = ereg_replace("\n","",$stringa);

    Quando premiamo INVIO per fare l'update dobbiamo richiamare nuovamente la funzione usata prima e cioè bubu77 per riconvertire tutto allo stato originale e cioè:

    1) i [b] in <&lt;b&gt;
    2) l' "a capo" in
    e così via.

    prima della query di update rifacciamo la solita manfrina fatta in precedenza:

    Codice PHP:
    $campo1 bubu77($campo1);
    $campo2 bubu77($campo2);
    $campo3 bubu77($campo3);
    $campo4 bubu77($campo4);
    e così via fino a 10 
    Ok...penso di aver finito. La pillola è venuta un po' lunga ma io sono prolisso di mio... voi non fateci caso...mica devono essere tutte così

    Sicuramente ci sarà qualche errore perchè è notte ed io non sono un esperto; ogni intervento è ben accetto.

    baci e abbacchi
    w la topa

  2. #2
    bellissimo
    Se in un primo momento l'idea non è assurda, allora non c'è nessuna speranza che
    si realizzi
    .
    Os: WinME
    Lang: C++
    Editor: C++ Builder 6 Enterprise

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    ho potuto solo riscontrare un piccolo errore nell'alert

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2000
    Messaggi
    1,175
    complimenti

  5. #5
    Saibal, il nostro supereroe!

    Avevo fatto qualcosa di simile in un sito che sto finendo in questi giorni.
    Per amor di pulizia di codice, e non solo, potrebbe essere carina una piccola modifica.
    Non è certamente vincolante, ma a qualcuno potrebbe essere utile.
    Con nl2br() tutti gli "accapo" vengono sostituiti con il
    . Nel caso del forum, questo può essere utile, perchè se una persona vuole andare a capo 20 volte, verranno inseriti correttamente 20 br.
    Se invece il sistema viene usato per il content management di un sito "informativo", potrebbe essere utile (almeno io l'ho trovata una cosa utile) sostituire i singoli accapo con un br, e gli "accapo multipli" (qualsiasi sia il numero, purchè maggiore di 1) con un nuovo paragrafo. In questo modo il codice html risultante sarà più ordinato.
    Se può interessare, appena ho 5 minuti posto il codice che consente di fare ciò.

  6. #6

    graaaaaande!


  7. #7
    vai skidx...attendiamo la tua aggiunta
    w la topa

  8. #8
    Originariamente inviato da saibal
    vai skidx...attendiamo la tua aggiunta
    In questi giorni la testerò sul server linux dove girerà, quindi attendete ancora un pò, preferisco averla testata e corretta in modo da non indurre nessuno in errore.

  9. #9
    Ottima questa pillola!
    Così magari trovate le controindicazioni al sistema che uso io:

    Codice PHP:
    // trasformo i return in 

    $commento eregi_replace("\n","
    "
    ,"$commento");
    // rimpiazzo i < con &lt
    $commento eregi_replace("<","&lt;",$commento);
    // riconverto i 

    $commento eregi_replace("&lt;br>","
    "
    ,$commento); 
    Ciao
    ...Ho viste cose che voi umani non potreste immaginarvi. Navi da combattimento in fiamme al largo dei bastioni di Orione... e ho visto i raggi B balenare nel buio vicino alle porte di Tannhauser... e tutti quei momenti andranno perduti nel tempo come lacrime nella pioggia. E' tempo di morire...
    __________________

    "Fra le sabbie non più deserte son qui di presidio per l’eternità i ragazzi della Folgore: fior fiore di un popolo e d’un esercito in armi. Caduti per una idea, senza rimpianto, onorati nel ricordo dello stesso nemico, essi additano agli italiani, nella buona e nella avversa fortuna, il cammino dell’onore e della gloria".

    Onore alla Folgore!

    __________________

    [ HTML.it clone | il mio PHP ]

  10. #10
    Originariamente inviato da 3ks
    Ottima questa pillola!
    Così magari trovate le controindicazioni al sistema che uso io:

    Codice PHP:
    // trasformo i return in 

    $commento eregi_replace("\n","
    "
    ,"$commento");
    // rimpiazzo i < con &lt
    $commento eregi_replace("<","&lt;",$commento);
    // riconverto i 

    $commento eregi_replace("&lt;br>","
    "
    ,$commento); 
    Ciao

    fondamentalmente nessuna controindicazione se stai su WIN...però bisognerebbe vedere cosa succede a chi usa linux
    w la topa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.