Ошибка: Предупреждение: strpos () : смещение не содержится в строке – не удается найти решение

Я знаю, этот вопрос задан, но, к сожалению, ответов нет, как решить эту проблему.

Это появляется в моих логах:

Сообщение PHP: PHP Предупреждение: strpos (): смещение не содержится в строке в … на линии 479

К сожалению, я не могу понять, что вызывает эту проблему и как ее исправить. Я тестировал эту функцию много раз (с большим $ текстом, с коротким $ text, с $ спам-словами и без спам-слов), но я никогда не получаю эту ошибку. Итак, какие тексты мои пользователи представляют, которые вызывают эту ошибку?

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

Второй вопрос:

По какой-то причине эта функция не фильтрует первое слово строки. Например, в этой строковой функции не найдено слова «hotmail»:

 $text = 'hotmail test test test test'; 

но в этой строке он находит слово «hotmail»:

 $text = 'test hotmail test test test test'; 

К первому вопросу:

Скорее всего, в какой-то момент вы передаете пустую строку своей функции. Offset в вызове strpos указывает, с какого символа он должен начать поиск $needle . Он основан на 0, поэтому, если вы хотите начать с абсолютного начала, вы либо установите его на 0, либо опустите его (по умолчанию оно равно 0.)

К второму вопросу:

Как упоминалось ранее, смещение основано на 0, поэтому, если $needle который вы ищете, находится точно в начале $haystack , его нельзя найти, если $offset равно 1. С $offset = 1 это было бы так, как если бы вы 'поиск в строке, которая выглядит так: 'otmail test test test test' .

Еще кое-что:

Я предлагаю вам использовать stripos , а не strpos для ваших целей, так как он нечувствителен к регистру и также найдет слова с прописными буквами, если это то, что вам может понадобиться.

Значение смещения больше, чем длина строки для поиска.

Чтобы ответить на второй вопрос, у вас есть два вопроса в коде. Предполагая, что ваша текстовая строка:

 $text = 'hotmail test test test test'; 

.. и ваш оператор if

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

Во-первых, вы начинаете со смещения 1, а слово «hotmail» находится в позиции 0. Таким образом, указав смещение 1, вы проверяете String:

 otmail test test test test 

…и не

 hotmail test test test test 

Во-вторых, если «hotmail» находится в позиции 0, ваша функция strposab () вернет значение int (0), которое является небулевым значением, которое при использовании в булевом выражении имеет значение FALSE. Поэтому вам нужно использовать оператор! ==, чтобы избежать жонглирования. Таким образом, правильная инструкция if будет использоваться:

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