2013-04-27 21 views
5

Bu soru sorulmuştur, ancak maalesef bu sorunun nasıl çözüleceğine dair herhangi bir cevap yoktur.Hata: Uyarı: strpos() [function.strpos]: Offset dizgi içermiyor - çözüm bulamıyor

Bu benim günlük dosyalarından görünür:

PHP mesajı: PHP Uyarı: strpos(): Offset 479

Maalesef on line in ... dizesinde yer almayan, ne neden anlayamıyorum Bu sorun ve nasıl düzeltileceği. Bu işlevi birçok kez test ettim (büyük $ metin, kısa $ metin, $ spam sözcükleri ve $ spam sözcükleri olmadan) ama asla bu hatayı almıyorum. Öyleyse, kullanıcılarım neden bu tür hatalar gönderir?

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

İkinci soru: Bu fonksiyon dizesinin ilk kelimeyi filtre uygulamaz Nedense

. Bu dize işlevi kelime "hotmail" bulamazsa Örneğin : İlk soru için

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

[ "* Ayrıca bu dize pozisyonları 1 0 dan başlar ve not . * "] (http://us.php.net/strpos#refsect1-function.strpos-returnvalues). Başlangıç ​​ofseti olarak '0' yerine' 1’i geçiyorsunuz ve kullanıcılarınız boş bir dize/tek karakter gönderiyor. – DCoder

cevap

1

:

$text = 'hotmail test test test test'; 

ama bu dizede o kelime "hotmail" bulur

Büyük ihtimalle bir noktada boş bir dizeyi işinize geçiriyorsunuz. strpos aramasındaki Offset, hangi karakterden $needle aramaya başlayacağını gösterir. Bu 0 tabanlı, yani mutlak baştan başlamak istiyorsanız, ya 0 olarak ayarlayın ya da (0'a varsayılan olarak) ikinci soru için

ihmal: Daha önce belirtildiği gibi

ofset 0 tabanlı, bu yüzden $needle aradığınız tam olarak $haystack başlangıcında ise, $offset 1 ise, bulamazsınız. ile sanki benzeyen bir dizide Bu: 'otmail test test test test'.

Bir şey daha:

Ben küçük harfe duyarlı değildir ve bunu gerekebilir bir şeyse de, büyük harf olan kelimeleri bulacaksınız sunduğundan amaçlarla stripos değil strpos kullanmalıdır düşündürmektedir.

+0

Evet, boş bir dizeydi. Teşekkürler. – user1406271

+0

bunların hiçbiri benim için doğru değil :( – Gediminas

1

İkinci sorunuzu yanıtlamak için - kodunuzda iki sorun var. Metin dizesini varsayarsak geçerli: kelime "hotmail" Yani tarafından 0 konumunda iken

$text = 'hotmail test test test test'; 

..ve deyimi başlıyorsak

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

İlk ise bunu, 1 ofset 1 ofsetini belirterek, dize karşı denetliyorsunuz:

otmail test test test test 

...değil

hotmail test test test test 

0 konumunda olmak "hotmail" ile İkincisi, senin strposab() fonksiyonu int bir değer dönecektir (0), bir Boole kullanıldığında o olmayan bir Boole değeri olan ifade YANLIŞ olarak değerlendirir. Bu nedenle, tür hokkabazını önlemek için! == operatörünü kullanmanız gerekir. Yani doğru kullanmak deyim olacaksa.

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

ofset değeri arama yapmak dize uzunluğundan daha fazladır