• User Attivo

    filtro parole in php

    Ciao a tutti
    In un sito ho l'esigenza di realizzare un filtro parole.
    Mi spiego meglio...
    Ho un sito in cui gli utenti inseriscono dei testi tramite una text area. Questi testi andrebbero salvati a databese. Prima di salvarli devo pero verificare che non siano state inserite parolacce.

    Vorrei quindi prendere il testo che arriva dalla text area, scorrere parola per parola il testo e verificare se all'interno del testo è stata trovata una delle parole indesifderate.
    Se una parola è stata trovata devo rispondere con un messaggio di errore.

    Le parole indesiderate stanno all'interno di un array.

    Ho trovato queso giochino qui
    [HTML]//variabile passata tramite form
    $testo_form = $_POST["preghiera"];
    /* creo un array che contiene tutte le parole che voglio vietare di inserire nel form*/
    $parolacce=array('parolaccia','seconda parolaccia','.azz','cac..');
    /cicla ogni parola presente nell'array e assegna ogni valore alla variabile/
    foreach($parolacce as $parolaccia)
    {
    /* funzione di libreria che sostituisce le parole trovate in comune nell'array e nel testo inviato tramite form con le tre x /
    $nome=ereg_replace($parolaccia,'xxx',$nome);
    }
    /
    se è stata inserita una parolaccia restituisce un messaggio di errore*/
    if ($nome == "xxx"){
    echo "non sono ammesse queste parole<br>";
    $errore = 1;
    }[/HTML]

    Ma non sembra funzionare... e non ho ben capito quando questo script andrebbe a verificare il mio testo, sembra girar da solo e non far nulla...

    Mi sapreste aiutare?

    Ciao grazie


  • User Attivo

    Ciao alebal,
    lo script che stai cercando di implementare sostituisce la parolaccia con xxx mentre da come hai espresso il problema è sufficiente individuare (ereg_replace sostituisce, non si limita a riconoscere).

    Inoltre nella riga:

    $nome=ereg_replace($parolaccia,'xxx',$nome);

    devi sostituire alla variabile in rosso ciò che proviene dal form:

    $testo_form=ereg_replace($parolaccia,'xxx',$testo_form);

    Il risultato dello script sarà il testo del form con ogni parolaccia sotituita da 'xxx'.
    per quello che ti occorre:

    $pos=strpos($parolaccia,$testo_form);
    if ($pos === false){
    //Nessuna parolaccia, fai quello che devi
    }else{
    echo "non sono ammesse queste parole<br>";
    //regolati di conseguenza!
    }

    Spero di esserti stato d'aiuto!
    :ciauz:


  • User

    mmm interessante :vai:
    :vaiii: mi potrà servire...


  • User Attivo

    Ho aperto una discussione su questo argomento se lo riesci a far funzionare sarebbe l'ideale per tutti e due.http://www.giorgiotave.it/forum/php-mysql/58764-filtro-sezione-commenti.html:ciauz:


  • User Attivo

    Funziona!:D:D:D:D

    Non ho ben capito come, con strpos non ne voleva sapere, ma con strrpos (con 2 erre) funziona perfettamente.

    Il codice finale è questo:
    [HTML]
    /* creo un array che contiene tutte le parole che voglio vietare di inserire nel form*/
    $parolacce=array('parolaccia','seconda parolaccia','.azz','cac..');
    /cicla ogni parola presente nell'array e assegna ogni valore alla variabile/
    foreach($parolacce as $parolaccia)
    {
    $pos=strrpos($testo_form,$parolaccia);
    }
    if ($pos === false ){
    //Nessuna parolaccia, fai quello che devi
    }else{
    //regolati di conseguenza!
    }
    [/HTML]

    ora ci metto anche l'array in un file di testo, cosi creo un area amministrativa in cui poter aggiungere nuove parolacce.

    Grazie mille

    Ciao


  • User Attivo

    Altra piccola cosa, non trovo più la funzione cerca all'interno del forum, sapete che fine ha fatto?


  • User Attivo

    Per la funzione cerca, ti devi prima loggare, quindi la trovi nella barra blu in alto.
    La differenza fra strpos e strrpos è che la prima trova la posizione della prima occorrenza mentre la seconda trova la posizione dell'ultima occorrenza.
    :ciauz:


  • User Attivo

    😢😢😢

    Sembrava troppo bello!

    Ora ho questo codice:
    [HTML]
    //recupero parolacce da file
    $var=fopen("article/cache/filtro.php","r");
    $parole=fread($var,filesize("article/cache/filtro.php"));
    echo $parole;
    /* creo un array che contiene tutte le parole che voglio vietare di inserire nel form*/
    $parolacce=array(strip_tags($parole));
    /cicla ogni parola presente nell'array e assegna ogni valore alla variabile/
    foreach($parolacce as $parolaccia)
    {
    $pos=strrpos($testo_form,$parolaccia);
    }
    if ($pos === false ){
    //Nessuna parolaccia,fai quello che devi
    }else{
    //regolati di conseguenza!
    }
    [/HTML]

    perchè se ci metto l'apertura del file non funziona piu nulla?

    • se la cancello e scrivo l'array -> funziona
    • se la lascio e scrivo l'array -> non funziona
    • se la lascio e passo $parole -> non funziona

    non l'ho proprio capita, però mi rompe, è proprio brutto un filtro parole a cui non posso aggiungere/togliere parole


  • User Attivo

    Ciao per creare un array che contiene le parole proibite puoi usare questa funzione che crea un array con tutte le parole presenti nel file filtro.txt . [PHP]$parole proibite = file('filtro.txt');[/PHP]
    Il file txt lo devi creare usando una riga per ogni parola.:ciauz:


  • User Attivo

    Insiste nello stargli sulle balle l'array ricavato da file esterno.
    Se me lo scrivo a mano nel codice tutto funziona
    Se lo richiamo da un file, anche con la funzione file() non funzia piu nulla...

    :arrabbiato:

    Qualche idea ??


  • User Attivo

    Le parole nel file txt come le scrivi? Le devi mettere una per riga.

    Inoltre, con un ciclo foreach o con un var_dump fatti stampare a monitor sia il contenuto dell'array ricavato da file che quello costruito a manina da te nel codice e che ti funziona e confronta le differenze...


    :ciauz:


  • User Attivo

    Mi sono accorto di una cosa strana.

    Per motivi legati ai tempi di consegan avevo sospeso per un attimo la fase in metto un file di testo da cui pescare le parolacce. Ed avevo mantenuto il codice iniziale con l'array scritto a manina.

    Ho fatto tutti i miei test con 4/5 parolacce e tutto funzionava.
    Oggi ho implemantato l'array con la lista delle parolacce, aggiungendo valori all'array, e mi sono accorto che con 4/5 parole funziona tutto, con un maggiore numero di parole non funziona più nulla...

    Qualcuno a qualche idea sullo starno comportamento di questo script??

    Pensavo di essere stato io ad aver compilato male l'array, ma sono ore che lo guardo e non trovo nulla di strano nei valori passati.

    Non la riesco prorpio a capire....

    il codice è di nuovo questo nella sua versione iniziale..

    [HTML]/* creo un array che contiene tutte le parole che voglio vietare di inserire nel form*/

    $parolacce=array('mer...','merdacc...','merdi...','merd...');
    /cicla ogni parola presente nell'array e assegna ogni valore alla variabile/
    foreach($parolacce as $parolaccia)
    {
    $pos= strrpos($testo_form, $parolaccia);
    }
    if ($pos === false ){
    //Nessuna parolaccia, fai quello che devi
    }else{
    //regolati di conseguenza!
    }
    [/HTML]


  • User Attivo

    Prova a postarci lo script con 7-8 parole per vedere dove non funziona...
    :ciauz:


  • User Attivo

    Ehmm...

    Cosa vi posto tutte le parolacce?
    non mi pare molto carino.

    Comunque il codice che ho sul mio sito è uguale a quello postato, basta aggiungere parole all'array.
    Ho anche provato a cambiare l'ordine delle parole nell'array, ma non cambia nulla.

    Vi allego il codice che sto usando con tutte le parolacce in un file di testo cosi evito di sporcare il forum.
    Ciao Grazie


  • User Attivo

    Se hai PHP5 nel ciclo foreach prova a scrivere &$parolaccia


  • User Attivo

    @alebal said:

    Ehmm...

    Cosa vi posto tutte le parolacce?
    non mi pare molto carino.

    Certo che no... bastava mettere delle parole tipo mare, fiori, luna, ecc... al posto delle parolacce. 😉

    Detto ciò, il problema è che se in $testo_form l'ultima parola non è da filtrare (cioè non è una parolaccia) $pos torna a false, anche se il testo precedente è pieno di parole da filtrare... e salta tutto lo script. Prova con:

    $alert=0;
    foreach($parolacce as $parolaccia) {
    $pos= strrpos($testo_form, "/\b".$parolaccia."(?i)\b/i");
    //$pos = strrpos($testo_form, $parolaccia);
    if ($pos === true && $alert==0)
    ***$alert=1; ***
    }
    if ($alert == 0){
    //Nessuna parolaccia, fai quello che devi
    echo "Trovato!!! - ".$testo_form;
    }else{
    echo "Non trovato -".$testo_form;
    //regolati di conseguenza!
    }

    ...dovrebbe funzionare. La logica è abbastanza chiara: solo la prima volta che viene trovata una parolaccia $alert viene messo a 1 senza possibilità di tornare a 0 e il controllo finale lo faccio proprio su $alert.

    Provalo e facci sapere se fenziona...
    :ciauz:


  • User Attivo

    :arrabbiato:

    Niente da fare, alert rimane sempre a 0 e mi rispponde sempre che ha trovato parolacce.

    In una risposta precedente qualcuno mi suggeriva di mettere una & sul foreach in php5. Cambia qualcosa in php5? perche la &? e soprattutto dove la devo mettere? ho provato dentro al foreach prima di $parolaccia ma php risponde che non se l'aspettava.


  • User Attivo

    ci è sfuggito strrpos, che non fa quello che vuoi... il comando giusto è strpos (con una sola r). Inoltre gli argomenti di strpos non erano specificati bene e l'if finale era invertito (mea culpa). Prova con:

    $alert=0;
    foreach($parolacce as $parolaccia) {
    $pos = strpos($testo_form, $parolaccia);
    if ($pos !== false && $alert==0)
    ***$alert=1; ***
    echo $pos."-".$alert."-".$parolaccia."-<br>";
    }
    if ($alert == 0){
    //Nessuna parolaccia, fai quello che devi
    echo "Non Trovato!!! - ".$testo_form;
    }else{
    echo "Trovato -".$testo_form;
    //regolati di conseguenza!
    }

    e facci sapere!
    :ciauz:


  • User Attivo

    In una risposta precedente qualcuno mi suggeriva di mettere una & sul foreach in php5. Cambia qualcosa in php5? perche la &? e soprattutto dove la devo mettere? ho provato dentro al foreach prima di $parolaccia ma php risponde che non se l'aspettava.E stata implementata solo nel PHP5 e assegna un riferimento all'array invece che copiare i valori e pensavo che bypassasse il problema

    ***foreach(&$parolacce as $parolaccia) ***


  • User Attivo

    :ola:

    FUNZIONA!!!!!
    sON COSI CONTENTO CHE TRA UN Pò USO TUTTI GLI EMOTICONS POSSIBILI

    fINALMENTE DOPO TANTI LITIGI
    :00016032:

    GRAZIE MILLE
    E' STATA UNA LUNGA E DIFFICILE AVVENTURA MA SIAMO RIUSCITI A VENIRNE A CAPO

    GRAZIE A TUTTI PER L'AIUTO

    cIAO
    E ANCORA GRAZIE