$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
.