2013-04-27 37 views
5

Tôi biết, câu hỏi này đã được hỏi, nhưng rất tiếc, không có câu trả lời nào để giải quyết vấn đề này.Lỗi: Cảnh báo: strpos() [function.strpos]: Offset không có trong chuỗi - không thể tìm thấy giải pháp

này xuất hiện trong log của tôi:

PHP nhắn: PHP Warning: strpos(): offset không chứa trong chuỗi trong ... trên đường dây 479

Thật không may, tôi không thể hiểu những gì gây ra vấn đề này và cách khắc phục. Tôi đã thử nghiệm chức năng này nhiều lần (với văn bản $ lớn, với văn bản $ ngắn, với $ từ thư rác và không có từ spam $) nhưng tôi không bao giờ nhận được lỗi này. Vì vậy, loại văn bản người dùng của tôi gửi gây ra lỗi này?

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

Câu hỏi thứ hai:

Đối với một số lý do chức năng này không lọc từ đầu tiên của chuỗi. Ví dụ trong chuỗi chức năng này không tìm thấy chữ "hotmail":

$text = 'hotmail test test test test'; 

nhưng trong chuỗi này nó tìm thấy từ "hotmail":

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

[ "* Cũng lưu ý rằng vị trí chuỗi bắt đầu từ 0, và không 1 . * "] (http://us.php.net/strpos#refsect1-function.strpos-returnvalues). Bạn đang chuyển '1' thay vì' 0' làm giá trị bắt đầu và người dùng của bạn đang gửi một chuỗi trống/ký tự đơn. – DCoder

Trả lời

1

Để câu hỏi đầu tiên:

Rất có thể tại một thời điểm bạn đang chuyển một chuỗi rỗng vào hàm của bạn. Offset trong cuộc gọi strpos cho biết từ ký tự nào sẽ bắt đầu tìm kiếm $needle. Đó là 0-dựa, vì vậy nếu bạn muốn bắt đầu từ đầu tuyệt đối, bạn có thể thiết lập nó để 0 hoặc bỏ qua nó (nó mặc định là 0.)

Với câu hỏi thứ hai:

Như đã đề cập trước , giá trị chênh lệch bằng 0, vì vậy nếu $needle bạn đang tìm kiếm chính xác ở đầu số $haystack, thì không thể tìm thấy nếu $offset là 1. Với $offset = 1 nó sẽ giống như bạn đang tìm kiếm trong chuỗi giống như này: 'otmail test test test test'.

Một điều nữa:

tôi đề nghị bạn nên sử dụng stripos, không strpos cho mục đích của bạn, vì nó là case-insensitive và cũng sẽ tìm thấy các từ có chữ hoa, nếu đó là một cái gì đó bạn có thể cần.

+0

Vâng, đó là một chuỗi rỗng. Cảm ơn. – user1406271

+0

không ai trong số họ là đúng đối với tôi :( – Gediminas

1

Để trả lời câu hỏi thứ hai của bạn - bạn có hai vấn đề trong mã của mình. Giả sử chuỗi văn bản của bạn là:

$text = 'hotmail test test test test'; 

..và nếu tuyên bố là

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

Đầu tiên, bạn đang bắt đầu tại offset 1, trong khi chữ "hotmail" là ở vị trí 0. Vì vậy, bằng chỉ định độ lệch 1, bạn đang kiểm tra đối với Chuỗi:

otmail test test test test 

...và không

hotmail test test test test 

Thứ hai, với "hotmail" là ở vị trí 0, strposab của bạn() chức năng sẽ trả về giá trị int (0), đó là một giá trị không Boolean rằng khi sử dụng trong một Boolean biểu thức đánh giá thành FALSE. Vì vậy, bạn cần phải sử dụng toán tử! == để tránh việc loại bỏ việc tung hứng. Vì vậy, chính xác câu lệnh if để sử dụng sẽ là:.

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

Giá trị offset là cao hơn so với chiều dài của chuỗi để tìm kiếm trong

Các vấn đề liên quan