$filename = 'my_upgrade(1).zip'; $match = 'my_upgrade'; if(!strpos($filename, $match)) { die(); } else { //proceed }
В приведенном выше коде я пытаюсь вырваться из сценария, когда имя файла не содержит текстовую строку «my_upgrade». Однако в приведенном примере он не должен умереть, так как « my_upgrade (1) .zip » содержит строку « my_upgrade ».
Что мне не хватает?
strpos возвращает false если строка не найдена, и 0 если она найдена в начале. Используйте оператор идентификации, чтобы отличить два:
if (strpos($filename, $match) === false) {
Кстати, этот факт документирован красным фоном и восклицательным знаком в официальной документации .
if (strpos($filename, $match) === false)
В противном случае strpos вернет 0 (индекс совпадения), что является false .
Оператор === также будет сравнивать тип переменных (boolean! = Integer)
false === strpos($filename, $match)
Функция strpos Docs возвращает false если не найдена или 0 если она найдена в позиции 0 (программисты любят часто начинать с 0 ):
Предупреждение Эта функция может возвращать Boolean
FALSE, но также может возвращать небулевое значение, которое оценивается какFALSE, например0или"". Пожалуйста, прочитайте раздел о Booleans для получения дополнительной информации. Используйте оператор===для проверки возвращаемого значения этой функции.
Функция strpos() чувствительна к регистру.
if(strpos($filename, $match) !== false) { // $match is present in $filename } else { // $match is not present in $filename }
Для использования без учета регистра. используйте stripos() который находит положение первого вхождения строки внутри другой строки (без учета регистра)
strpos в этом случае возвращает ноль, который затем интерпретируется как false, когда вы выполняете логическое отрицание. Вы должны явно указать логическое значение false .