2013-04-27 6 views
5

Wiem, to pytanie zostało zadane, ale niestety, nie ma odpowiedzi, jak rozwiązać ten problem.Błąd: Ostrzeżenie: strpos() [function.strpos]: Przesunięcie nie zawarte w łańcuchu - nie można znaleźć rozwiązania

ten pojawia się w moich logów:

PHP wiadomość: PHP Warning: strpos(): Offset nie zawarte w ciąg w ... on line 479

Niestety, nie mogę zrozumieć, co powoduje ten problem i jak go naprawić. Testowałem tę funkcję wiele razy (z dużym tekstem $, krótkim tekstem $, słowami $ spam i bez słów $ spam), ale nigdy nie dostaję tego błędu. A więc, jakiego rodzaju teksty przesyłają moi użytkownicy, powodując ten błąd?

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

Drugie pytanie:

Z jakiegoś powodu ta funkcja nie filtruje pierwsze słowo łańcucha. Na przykład w tej funkcji ciąg nie znajdzie słowo "hotmail":

$text = 'hotmail test test test test'; 

ale w tym ciągu znajdzie słowo "hotmail":

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

[ "* Należy również pamiętać, zaczynaj pozycji smyczkowych na 0, a nie 1 . * "] (http://us.php.net/strpos#refsect1-function.strpos-returnvalues). Przepisujesz "1" zamiast "0" jako offset początkowy, a Twoi użytkownicy przesyłają pusty ciąg/pojedynczy znak. – DCoder

Odpowiedz

1

Do pierwszego pytania:

Najprawdopodobniej w pewnym momencie przekazujesz pusty ciąg do swojej funkcji. Offset w wywołaniu strpos wskazuje, od którego znaku należy rozpocząć wyszukiwanie $needle. Jest oparty o 0, więc jeśli chcesz zacząć od absolutnego początku, to albo ustawić go na 0 lub go pominąć (domyślnie go do 0.)

na drugie pytanie:

Jak wspomniano wcześniej , przesunięcie jest oparte na 0, więc jeśli szukane jest $needle jest dokładnie na początku $haystack, nie można znaleźć, jeśli $offset jest 1. Z $offset = 1 byłoby tak, jakbyś szukał w ciągu, który wygląda jak to: 'otmail test test test test'.

jeszcze jedno:

Proponuję należy użyć stripos, nie strpos dla swoich celów, jak to jest wielkość liter, a także znaleźć słów z dużymi literami, czy to coś może być konieczne.

+0

Tak, był to pusty ciąg. Dzięki. – user1406271

+0

żadna z nich nie była dla mnie prawdziwa :( – Gediminas

1

Aby odpowiedzieć na twoje drugie pytanie - masz dwa problemy w swoim kodzie. Zakładając, że tekst jest:

$text = 'hotmail test test test test'; 

..i swój if jest

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

Najpierw zaczynasz na przesunięcie 1, podczas gdy słowo „hotmail” jest w pozycji 0. Więc przez określając przesunięcie 1, sprawdzasz w łańcuchu:

otmail test test test test 

...i nie

hotmail test test test test 

Po drugie, z „hotmail” będącego na pozycji 0, funkcja Twój strposab() zwróci wartość int (0), który jest non-Boolean wartość, gdy jest stosowany w Boolean wyrażenie zwraca wartość FALSE. W związku z tym musisz użyć operatora! ==, aby uniknąć żonglowania typami. Więc prawidłowa if używać będzie.

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

Wartość przesunięcia jest większa niż długość napisu, aby szukać w

Powiązane problemy