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.
Rispondi
Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

stringhe in php [risolto]

Messaggio 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
Ultima modifica di sya54M il lun 14 gen 2013, 10:29, modificato 1 volta in totale.

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: stringhe in php

Messaggio 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.

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php

Messaggio da sya54M »

sei sicuro? io sapevo che il needle è la parola da cercare. è proprio strano, il codice è semplice ma fa cose strane

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: stringhe in php

Messaggio da ZeroUno »

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
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

Re: stringhe in php

Messaggio 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.

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php

Messaggio 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.

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php

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

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: stringhe in php

Messaggio 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.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php [risolto]

Messaggio 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) {

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: stringhe in php [risolto]

Messaggio da ZeroUno »

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
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php [risolto]

Messaggio 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

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: stringhe in php [risolto]

Messaggio 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)
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php [risolto]

Messaggio 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 ")) {

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

Re: stringhe in php [risolto]

Messaggio da ZeroUno »

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
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: stringhe in php [risolto]

Messaggio 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

Rispondi