• User

    Togliere gli spazi bianchi intermedi: è possibile?

    Ho un problema che si verifica quando il form viene compliato una seconda volta e in uno dei campi si inseriscono le stesse parole ma staccate da un numero diverso di spazi bianchi intermedi.

    Per evitare che il form sia compilato due volte con stessi dati, prima di inserire un nuovo record nella tabella si esegue un controllo.

    Faccio una verifica se il valore introdotto nel campo è già presente nel database. Se già inserito, rimando a pagina di errore. Se non presente si inserisce un nuovo record.

    PROBLEMA
    Quando si complia il campo di un form e con la barra spaziatrice si inseriscono tra le parole 2 o più spazi bianchi, il valore del campo risulta diverso, e di conseguenza si aggiunge un nuovo record nella tabella, cosa che non dovrebbe accadere....

    Faccio un esempio pratico, se nel campo si inseriscono i valori:

    Pizzeria Bellavista (separate da 1 spazio bianco)
    Pizzeria Bellavista (separate da 2 spazi bianchi)
    Pizzeria Bellavista (separate da 3 spazi bianchi)
    Pizzeria Bellavista (separate da 4 spazi bianchi)

    questi sono considerati diversi e vengono aggiunti nella tabella
    io vorrei che fossero considerati tutti uguali e non diversi e lo spazio bianco interno fosse ridotto ad 1 solo

    Per prevenire simili errori in fase di data entry si è soliti usare le funzioni ltrim e rtrim ma queste eliminano solo gli spazi bianchi all'inizio ed alla fine

    Mi chiedevo se esiste una funzione analoga che riduce gli spazi bianchi intermedi ad 1 solo spazio togliendo tutti quelli superflui

    Esiste?

    Un saluto


  • User Attivo

    Non mi ricordo e non posso provare ora, ma credo che puoi risolvere facendo:

    $testo_pulito = implode(" ", explode(" ",$testo_da_pulire));


  • User

    @CZero said:

    Non mi ricordo e non posso provare ora, ma credo che puoi risolvere facendo:

    $testo_pulito = implode(" ", explode(" ",$testo_da_pulire));

    Ciao e grazie per la risposta,

    No... purtroppo non va

    il valore del campo lo ripulisco in questo modo prima del confronto:

    $nome = ltrim(rtrim(strip_tags($_POST['nome'])));

    dietro tuo consiglio ho poi messo

    $nome_pulito = implode(" ", explode(" ",$nome));

    ma il risultato non cambia.... gli spazi bianchi intermedi restituiscono sempre valori diversi e non confrontabili

    Qualcuno si è trovato in questa situazione e sa come fare?


  • Super User

    @Redart said:

    Ciao e grazie per la risposta,

    No... purtroppo non va

    il valore del campo lo ripulisco in questo modo prima del confronto:

    $nome = ltrim(rtrim(strip_tags($_POST['nome'])));

    dietro tuo consiglio ho poi messo

    $nome_pulito = implode(" ", explode(" ",$nome));

    ma il risultato non cambia.... gli spazi bianchi intermedi restituiscono sempre valori diversi e non confrontabili

    Qualcuno si è trovato in questa situazione e sa come fare?

    Puoi risolvere con le espressioni regolari.

    $testo_parsato = preg_replace("\040{2,}", "\040", $testo_da_parsare);

    Dovrebbe andare, non ho testato niente 😛


  • User Attivo

    io ho fatto così:

    
    $testo=str_replace('  ',' ',$testo_da_parserare);
    
    

  • Super User

    @piccolosocrate said:

    io ho fatto così:

    
    $testo=str_replace('  ',' ',$testo_da_parserare);
    
    

    Questo non va perchè tu a priori non sai quanti spazi bianchi ci sono...


  • User

    Ciao,

    e grazie per l'interessamento a quelli che hanno postato (PaTeR, CZero, piccolosocrate)

    purtroppo i suggerimenti non hanno dato frutti

    [LEFT]quello di piccolosocrate funziona benissimo
    ma serve a sostituire solo il doppio spazio con uno solo[/LEFT]

    [LEFT]non sò se c'è un modo per rendere la funzione più generale
    [LEFT]per spazi >= a 2[/LEFT]

    [LEFT]ho provato a modificarla con[/LEFT]

    [LEFT]str_replace('\040{2,}','\040',$testo_da_parsare);[/LEFT]

    ma nulla di nulla, non funziona

    che dite, si può modificare???

    [/LEFT]

    il codice complicatissimo di PaTeR in teoria dovrebbe andare ma
    anche questo non funziona

    se ho capito bene la funzione** preg_replace**
    esegue una ricerca ed una sostituzione con le espressioni regolari

    preg_replace (espressione_regolare, sostituto, testo)

    La funzione ricerca in testo i criteri impostati in espressione_regolare.
    e li sostituisce con sostituto.

    \040
    è modo per indicare uno spazio

    {2,}
    dovrebbe significare
    che quanto scritto prima si ripete da 2 volte ad infinito

    quindi, il tutto dovrebbe significare cerca all'interno di $testo_da_parsare gli spazi bianchi ripetuti 2 o più volte e sostituiscili con 1 solo spazio bianco

    purtoppo non va 😞

    ho fatto dei tentativi e ho provato anche a sostituire \040 con \40
    in quanto avevo letto che sono equivalenti.... ma nulla è cambiato

    ho provato anche a sostituire i doppi apici " " con quelli singoli ' '
    dopo aver visto il suggerimento di piccolosocrate,
    ma mi rida l'errore

    qualcun'altro ha suggerimenti?

    Un saluto


  • Super User

    Scusa, come al solito ho dimenticato i delimitatori... Li dimentico sempre 😛

    modifica così il codice:

    $b = preg_replace('#\040{2,}#', '\040', $a);

    $a è il tuo testo. $b è il testo risultante.


  • User

    @PaTeR said:

    Scusa, come al solito ho dimenticato i delimitatori... Li dimentico sempre 😛

    modifica così il codice:

    $b = preg_replace('#\040{2,}#', '\040', $a);

    $a è il tuo testo. $b è il testo risultante.

    Niente scuse PaTeR.........
    solo grazie per la disponibilità 😉

    mi spiace deluderti ma purtroppo non và
    sono stato attento a copiarlo per bene ma proprio non funziona

    $nome_pulito = preg_replace('#\040{2,}#', '\040', $nome);

    la soluzione è più ardua di quanto pensassi :arrabbiato:

    Ciao


  • Super User

    @Redart said:

    Niente scuse PaTeR.........
    solo grazie per la disponibilità 😉

    mi spiace deluderti ma purtroppo non và
    sono stato attento a copiarlo per bene ma proprio non funziona

    $nome_pulito = preg_replace('#\040{2,}#', '\040', $nome);

    la soluzione è più ardua di quanto pensassi :arrabbiato:

    Ciao
    A me funziona... guarda qui ( ho levato il secondo \040 per mettere uno spazio) :
    http://phoenixdivision.byethost16.com/aaa.php

    Naturalmente non si nota niente dal browser, devi vedere il sorgente della pagina.


  • User Attivo

    allora senza impelagarti in script atroci con tre righe risolvi il problema....

    $testo=str_replace(' ',' ',$testo_da_parserare);
    $testo=str_replace(' ',' ',$testo);
    $testo=str_replace(' ',' ',$testo);


  • Super User

    @piccolosocrate said:

    allora senza impelagarti in script atroci con tre righe risolvi il problema....

    $testo=str_replace(' ',' ',$testo_da_parserare);
    $testo=str_replace(' ',' ',$testo);
    $testo=str_replace(' ',' ',$testo);
    Non è script atroce quello che ho fatto... è script funzionante. Questo è un pò di codice in extremis, ma se funziona... tanto bene per lui...


  • Moderatore

    $testo=str_replace(' ',' ',$testo_da_parserare);
    $testo=str_replace(' ',' ',$testo);
    $testo=str_replace(' ',' ',$testo);

    Dai. E' osceno. E se gli spazi sono 8? 🙂

    Quoto pater ed aggiungo che potresti crearti una funziona apposta e passargli i valori.

    Una cosa del tipo:

    function rimuovispazi($testo,$trim=true) {
    $testo=preg_replace("#\s{2,}#", " ", $testo);
    return $testo=($trim)?trim($testo):$testo;
    }

    che chiamerai con:
    $text=rimuovispazi($vecchiotesto); se vuoi anche togliere gli spazi ad inizio e fine riga o
    $text=rimuovispazi($vecchiotesto,false); se non vuoi

    :ciauz:


  • User

    Ciao,

    ho risolto con il codice di PaTeR (grazie 😉

    $nome_pulito = preg_replace('#\040{2,}#', ' ', $nome);

    è bastato cancellare il secondo \040 ed inserire uno spazio vuoto è tutto ha funzionato

    grazie mille

    Buona giornata