2013-04-27 6 views
5

So che questa domanda è stata posta, ma sfortunatamente non ci sono risposte su come risolvere questo problema.Errore: avviso: strpos() [function.strpos]: Offset non contenuto nella stringa - impossibile trovare la soluzione

Questo appare nei miei file di log:

PHP messaggio: PHP Warning: strpos(): Offset non contenuti nella stringa ... on line 479

Purtroppo, non riesco a capire che cosa provoca questo problema e come risolverlo. Ho provato questa funzione molte volte (con un grande $ text, con un breve $ text, con $ spam words e senza $ spam words) ma non ho mai ricevuto questo errore. Quindi, che tipo di testi inviati dai miei utenti che causano questo errore?

if (strposab($text, $spam, 1)) { 
    echo "Email addresses and URLs not allowed here"; 
die; 
    } 

$spam = array('http','www','hotmail','yahoo','gmail','msn'); 


function strposab($haystack, $needles=array(), $offset=0) { 
$chr = array(); 
foreach($needles as $needle) { 
$res = strpos($haystack, $needle, $offset); 
if ($res !== false) $chr[$needle] = $res; 
} 
if(empty($chr)) return false; 
return min($chr); 
} 

Seconda domanda:

Per qualche ragione questa funzione non filtra la prima parola della stringa. Per esempio in questa funzione di stringa non trova parola "hotmail":

$text = 'hotmail test test test test'; 

ma in questa stringa trova parola "hotmail":

$text = 'test hotmail test test test test'; 
+2

[ "* Si noti inoltre che le posizioni della stringa partono da 0, e non 1 . * "] (http://us.php.net/strpos#refsect1-function.strpos-returnvalues). Stai passando '1' anziché' 0' come offset iniziale, e i tuoi utenti stanno inviando una stringa vuota/un singolo carattere. – DCoder

risposta

1

Alla prima domanda:

Molto probabilmente a un certo punto stai passando una stringa vuota alla tua funzione. Offset nella chiamata strpos indica da quale carattere deve iniziare la ricerca di $needle. E '0-based, quindi se si vuole cominciare dall'inizio assoluto, si sia impostato a 0 o omettere esso (il valore predefinito è 0.)

Alla seconda domanda:

Come accennato prima , l'offset è basato su 0, quindi se $needle si sta cercando è esattamente all'inizio di $haystack, non può essere trovato se $offset è 1. Con $offset = 1 sarebbe come se si sta cercando in una stringa che assomiglia questo: 'otmail test test test test'.

Ancora una cosa:

vi suggerisco dovrebbe usare stripos, non strpos per i vostri scopi, come è case-insensitive e sarà anche trovare le parole con le lettere maiuscole, se si tratta di qualcosa che potrebbe essere necessario.

+0

Sì, era una stringa vuota. Grazie. – user1406271

+0

nessuno di loro era vero per me :( – Gediminas

1

Per rispondere alla seconda domanda, si verificano due problemi nel codice. Supponendo che la stringa di testo è:

$text = 'hotmail test test test test'; 

..e il tuo if è

if (strposab($text, $spam, 1)) 

In primo luogo, si sta iniziando a compensare 1, mentre la parola "hotmail" è in posizione 0. Quindi, specificando uno scostamento di 1, verifichi la stringa:

otmail test test test test 

...e non

hotmail test test test test 

In secondo luogo, con "hotmail" essere in posizione 0, la funzione il vostro strposab() restituirà un valore di int (0), che è un valore non booleano che quando viene utilizzato in un valore booleano espressione valuta FALSE. Pertanto, è necessario utilizzare l'operatore! == per evitare la giocoleria di tipo. Quindi, la corretta istruzione if da usare sarà:.

if (strposab($text, $spam, 0) !== false) 
2

Il valore di offset è superiore alla lunghezza della stringa da ricercare in

Problemi correlati