Поиск слова с экранированным апострофом в строке с помощью strpos

У меня есть слово с экранированным апострофом в строке. Я пытаюсь использовать strpos, чтобы определить, находится ли слово с экранированным апострофом в строке или нет. К сожалению, каждый раз это ложное эхо. Что я делаю неправильно? Я пробовал в strpos с 1 экранированной косой чертой, 2 экранированной косой чертой, вплоть до 5, но каждый раз он повторяет ложь.

$text = "example\'s";
$text = " ".$text." ";

if (strpos($text, " example\\\\\'s ")) {
echo "true.";
}

else {
echo "false.";
}

person jessica    schedule 27.08.2015    source источник


Ответы (1)


Здесь есть две проблемы: первая заключается в экранировании строки, а вторая - в вашей логике на основе возврата из функции strpos.

Первая проблема заключается в том, что вам не нужно экранировать ввод поиска в strpos - это не функция регулярного выражения!

Вторая проблема заключается в том, что ваша (неэкранированная) строка поиска будет соответствовать нулевой позиции, которую PHP также интерпретирует как ложное значение.

В документации по PHP здесь говорится:

Предупреждение Эта функция может возвращать логическое значение ЛОЖЬ, но также может возвращать не логическое значение, которое оценивается как ЛОЖЬ. Пожалуйста, прочтите раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

Вместо этого используйте этот код, который должен работать нормально:

$text = "example\'s";
$text = " ".$text." ";

if (strpos($text, " example\'s ") === false) {
    echo "false.";
} else {
    echo "true.";
}

Ключевым моментом здесь является оператор === - он означает равное значение и тип, поэтому он не позволяет интерпретатору PHP обрабатывать нулевой возврат как равный false, что в противном случае было бы.

См. Справку по операторам сравнения PHP: http://php.net/manual/en/language.operators.comparison.php

Изменить: Дополнительная информация о значениях, которые PHP считает ложными: -

При преобразовании в логическое значение следующие значения считаются ЛОЖНЫМИ:

само логическое FALSE

целое число 0 (ноль)

поплавок 0,0 (ноль)

пустая строка и строка «0»

массив с нулевыми элементами

объект с нулевыми переменными-членами (только PHP 4)

специальный тип NULL (включая неустановленные переменные)

Объекты SimpleXML, созданные из пустых тегов

Любое другое значение считается ИСТИННЫМ (включая любой ресурс).

Предупреждение: -1 считается ИСТИННЫМ, как и любое другое ненулевое (отрицательное или положительное) число!

От: http://php.net/manual/en/language.types.boolean.php

person beercohol    schedule 27.08.2015
comment
Это все еще ложное эхо. - person jessica; 27.08.2015
comment
Я только что обновил свой ответ - вам вообще не нужно экранировать строку для strpos. Можешь попробовать еще раз? - person beercohol; 27.08.2015
comment
кстати, 0 - единственное значение, которое оно интерпретировало бы как ложное, используя ==? - person jessica; 27.08.2015
comment
Нет, есть еще много других! Я обновил свой ответ и дал ссылку на соответствующие документы PHP. Спасибо за согласие! - person beercohol; 27.08.2015