Я знаю, этот вопрос задан, но, к сожалению, ответов нет, как решить эту проблему.
Это появляется в моих логах:
Сообщение 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)