Repository 32bit  Forum
Repository 64bit  Wiki

stringhe in php [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

stringhe in php [risolto]

Messaggioda sya54M » dom gen 13, 2013 18:10

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
Ultima modifica di sya54M il lun gen 14, 2013 10:29, modificato 1 volta in totale.
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php

Messaggioda aschenaz » dom gen 13, 2013 19:13

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.
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4425
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.18
Desktop: KDE 4.10.5

Re: stringhe in php

Messaggioda sya54M » dom gen 13, 2013 23:30

sei sicuro? io sapevo che il needle è la parola da cercare. è proprio strano, il codice è semplice ma fa cose strane
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php

Messaggioda ZeroUno » dom gen 13, 2013 23:49

correggi gli apici

stripos($_GET["messaggio"], " $parola ")
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4398
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: stringhe in php

Messaggioda aschenaz » lun gen 14, 2013 7:59

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.
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4425
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.18
Desktop: KDE 4.10.5

Re: stringhe in php

Messaggioda sya54M » lun gen 14, 2013 10:03

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.
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php

Messaggioda sya54M » lun gen 14, 2013 10:28

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);

:)
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php

Messaggioda ZeroUno » lun gen 14, 2013 10:32

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.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4398
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: stringhe in php [risolto]

Messaggioda sya54M » lun gen 14, 2013 10:37

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) {
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php [risolto]

Messaggioda ZeroUno » lun gen 14, 2013 13:06

si, così viene considerata spam anche una parola che comincia o finisce per $parola.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4398
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: stringhe in php [risolto]

Messaggioda sya54M » lun gen 14, 2013 13:20

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
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php [risolto]

Messaggioda ZeroUno » lun gen 14, 2013 17:34

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)
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4398
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: stringhe in php [risolto]

Messaggioda sya54M » lun gen 14, 2013 18:07

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 ")) {
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13

Re: stringhe in php [risolto]

Messaggioda ZeroUno » lun gen 14, 2013 18:36

si, ma con stristr ti rimane il problema degli spazi
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4398
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: stringhe in php [risolto]

Messaggioda sya54M » lun gen 14, 2013 18:52

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
Avatar utente
sya54M
Linux 3.x
Linux 3.x
 
Messaggi: 1430
Iscritto il: mer giu 06, 2007 13:44
Località: (Salerno)
Nome Cognome: Andrea P.
Slackware: 64-current
Kernel: 3.14.x
Desktop: KDE 4.13


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite