Pagina 1 di 1

stringhe in php [risolto]

Inviato: dom 13 gen 2013, 18:10
da sya54M
ciao volevo fare un semplice filtro antispam che filtri i messaggi che contengono determinate parole che elenco in un txt una sotto l'altra.
ho scritto questo codice:

Codice: Seleziona tutto

$fp_parolespam = fopen("parolespam.txt", "r");
$parolespam = 1;
while(!feof($fp_parolespam)) {
  $parola = fgets($fp_parolespam, 4096);
  if(stripos("$_GET[messaggio]", " $parola ") !== false) {
    $parolespam = 0;
  }
}
fclose($fp_parolespam);
ma ha un comportamento che non capisco, se scrivo nel messaggio la prima parola elencata in parolespam.txt, $parolespam rimane a 1, quindi la condizione if non viene verificata, se scrivo l'ultima parola elencata funziona :?:
gli spazi prima e dopo in " $parola " sono voluti.
qualcuno mi sa spiegare cosa sbaglio? grazie a tutti.

ps: se servono spiegazioni sul codice basta chiedere

Re: stringhe in php

Inviato: dom 13 gen 2013, 19:13
da aschenaz
Ho l'impressione che stripos abbia i parametri invertiti. Prova con:

Codice: Seleziona tutto

stripos(" $parola ","$_GET[messaggio]")
In effetti il "needle" è la stringa passata col form, no? Così deve funzionare per forza.

Re: stringhe in php

Inviato: dom 13 gen 2013, 23:30
da sya54M
sei sicuro? io sapevo che il needle è la parola da cercare. è proprio strano, il codice è semplice ma fa cose strane

Re: stringhe in php

Inviato: dom 13 gen 2013, 23:49
da ZeroUno
correggi gli apici

stripos($_GET["messaggio"], " $parola ")

Re: stringhe in php

Inviato: lun 14 gen 2013, 7:59
da aschenaz
Sì, gli apici erano sfuggiti anche a me.

In merito al needle, bisogna vedere come la intendi tu: vuoi verificare se la parola passata dal form è presente nelle stringhe memorizzate sul file? Allora il needle è la parola passata dal form e quindi devi invertire gli argomenti.

Poi voglio farti notare una cosa: facciamo finta che tu passi col form la parola "pippo" e la stessa parola è presente nel file; come l'hai impostato tu, dici allo script di verificare se " pippo " (con gli spazi) è contenuta in "pippo" (senza spazi). E' ovvio che ti risponda di no. Diverso sarebbe nel caso opposto.

Re: stringhe in php

Inviato: lun 14 gen 2013, 10:03
da sya54M
io ho usato gli apici spesso in quel modo e ha sempre funzionato alla stessa maniera di come dite voi :?

poi il messaggio passato dal form probabilmente conterrà più parole (intere frasi) e la funzione deve verificare che nel messaggio (che contiene più parole) non ci sia nessuna delle parole elencate nel txt.

gli spazi li ho messi apposta per assicurarmi che non vengano intercettati pezzi di altre parole più lunghe come fossero le parole da individuare.

Re: stringhe in php

Inviato: lun 14 gen 2013, 10:28
da sya54M
ho capito il problema, fgets leggendo la riga includeva anche il newline come ultimo carattere della stringa e quindi non corrispondeva, l'ultima parola era l'unica ad essere riconosciuta perchè non c'erano altri newline dopo di essa.
ho risolto rimuovendo gli eventuali "\n" ad ogni lettura:

Codice: Seleziona tutto

$fp_parolespam = fopen("parolespam.txt", "r");
$parolespam = 1;
while(!feof($fp_parolespam)) {
  $parola = fgets($fp_parolespam, 4096);
  $parola = str_replace("\n", "", $parola);
  if(stripos("$_GET[messaggio]", " $parola ") !== false) {
    $parolespam = 0;
  }
}
fclose($fp_parolespam);
:)

Re: stringhe in php

Inviato: lun 14 gen 2013, 10:32
da ZeroUno
prova anche trim:
$parola = trim(fgets($fp_parolespam, 4096));


Per la storia degli spazi, fai conto che se il testo è 'ciao a tutti.' e parolespam.txt contiene le parole 'ciao' e 'tutti', il testo non sarà considerato spam.

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 10:37
da sya54M
ZeroUno ha scritto:Per la storia degli spazi, fai conto che se il testo è 'ciao a tutti.' e parolespam.txt contiene le parole 'ciao' e 'tutti', il testo non sarà considerato spam.
ci avevo già pensato ed ho fatto così:

Codice: Seleziona tutto

if(stripos("$_GET[messaggio]", " $parola") !== false || stripos("$_GET[messaggio]", "$parola ") !== false) {

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 13:06
da ZeroUno
si, così viene considerata spam anche una parola che comincia o finisce per $parola.

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 13:20
da sya54M
sì lo so, ma è meglio di niente, se non mettessi proprio gli spazi verrebbe considerata spam anche se si trova nel mezzo.
per essere sicuri che il sistema non sbagli bisognerebbe fare un controllo più accurato

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 17:34
da ZeroUno
Si può anche tenere in considerazione l'utilizzo di preg_match("/\b$parola\b/","$_GET[messaggio]");

Si può anche tenere in considerazione di fare il contrario.
metti il file in un array (operazione che fai in un solo passaggio con file() ), poi splitti $_GET e fai la ricerca con

$fp_parolespam =file("parolespam.txt");
$parolespam = 1;
foreach(split(" ",strtolower($_GET["messaggio"])) as $text)if(in_array("$text\n"))$parolespam=0;

assicurati che l'ultima riga di parolespam.txt abbia l'end-of-line (se editi con vi non hai problema)

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 18:07
da sya54M
hai ragione, la stessa cosa si può fare in più modi, si può usare anche stristr

Codice: Seleziona tutto

if(stristr("$_GET[messaggio]", " $parola") || stristr("$_GET[messaggio]", "$parola ")) {

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 18:36
da ZeroUno
si, ma con stristr ti rimane il problema degli spazi

Re: stringhe in php [risolto]

Inviato: lun 14 gen 2013, 18:52
da sya54M
ah bravo hai ragione, con \b in preg_match si risolve :)
però lo devo fare case insensitive così

Codice: Seleziona tutto

if(preg_match("/\b$parola\b/i", "$_GET[messaggio]") != 0) {
grazie mille