Почему функция, проверяющая пустую строку, всегда возвращает true? [закрыто]


231

У меня есть функция isNotEmpty, которая возвращает истину, если строка не пуста, и ложь, если строка пуста. Я обнаружил, что это не работает, если я пропущу через него пустую строку.

function isNotEmpty($input) 
{
    $strTemp = $input;
    $strTemp = trim($strTemp);

    if(strTemp != '') //Also tried this "if(strlen($strTemp) > 0)"
    {
         return true;
    }

    return false;
}

Проверка строки с использованием isNotEmpty выполнена:

if(isNotEmpty($userinput['phoneNumber']))
{
    //validate the phone number
}
else
{
    echo "Phone number not entered<br/>";
}

Если строка пуста, остальное не выполняется, я не понимаю почему, может кто-то, пожалуйста, пролить свет на это, пожалуйста.


55
Просто предложение: обычно плохая практика - использовать функции с отрицательными именами. Более читабельно иметь функцию isEmpty ($ input), в противном случае вы можете вызвать ее так: if (! IsNotEmpty ($ x)) ... С другой стороны, isNotEmpty () и (! IsEmpty ()) не являются что отличается. YMMV.
Johndodo

1
Чтобы иметь ту же функцию без отрицательного имени, возможно что-то вроде hasContent ().
ОсакаВебби

! thatDifferent @johndodo
кодерчет

Это, безусловно, не по теме: опечатка .
mickmackusa

Ответы:


320

Простая проблема на самом деле. Изменить:

if (strTemp != '')

в

if ($strTemp != '')

Возможно, вы также можете изменить его на:

if ($strTemp !== '')

с != ''будет возвращать true, если вы передадите число 0 и несколько других случаев из-за автоматического преобразования типов в PHP .

Вы не должны использовать встроенную функцию empty () для этого; см. комментарии и таблицы сравнения типов PHP .


4
Возможно, измените if на: return $ strTemp! == '';
Strager

12
Вы не хотите использовать empty (). Рассмотрим строку пробелов: $ x = ""; var_dump (пусто ($ х)!); / * (ИСТИНА) / var_dump (isNotEmpty ($ x)); / (ЛОЖЬ) * /
nickf

5
ОП обрезает строку. В этом случае это уместно.
Клет

8
@cletus: тогда рассмотрим строку $ s = '0'. Если вы вызываете empty ($ s), он будет иметь значение true (не интуитивно, но это так).
Johndodo

28
Не используйте empty ()! empty () вернет true для таких значений, как '0'. См. Php.net/manual/en/types.comparisons.php
Скотт Теслер,

27

В PHP есть встроенная функция, называемая empty() тестом. Для этого if(empty($string)){...} введите Справочник php.net: php empty


4
пустая ссылка уже в конце принятого ответа от клемы. Также проследите, чтобы эта ветка с вопросами и ответами была с апреля 2009 года. В любом случае, спасибо за ваш вклад. Я даю тебе +1 за первый ответ.
Regilero

64
Не используйте empty ()! empty () вернет true для таких значений, как '0'. См. Php.net/manual/en/types.comparisons.php
Скотт Теслер,

3
@ScottDavidTesler Если строка «0», она вернет true? Или только если это целое число 0?
Томас Зубири

5
@TomasZubiri Да, строка, содержащая «0», вернет true.
Майкл

3
ПОЖАЛУЙСТА, никто другой не проголосует за этот НЕПРАВИЛЬНЫЙ ответ - прочитайте комментарии выше!
ToolmakerSteve

24

Я всегда использую регулярное выражение для проверки пустой строки, начиная с дней CGI / Perl, а также с Javascript, так почему бы не использовать PHP, например (хотя и не проверено)

return preg_match('/\S/', $input);

Где \ S представляет любой непробельный символ


1
Это единственное решение, которое не предполагает, что ноль - это то же самое, что и пустая строка!
Мэтью Лок

1
Классное решение. В качестве примечания, stackoverflow.com/a/4544642/5411817 упоминает: по умолчанию .не совпадает с новыми строками - [\s\S]это решение этой проблемы. Это часто встречается в JavaScript, но в PHP вы можете использовать /sфлаг, чтобы точка соответствовала всем символам. И stackoverflow.com/a/4544646/5411817 упоминает: (?s)включает sрежим и (?-s)выключает, если выключен. После выключения любое следующее .не будет соответствовать новой строке. если вы хотите включить / выключить переключатель (встроенный в регулярное выражение), а не как флаг регулярного выражения.
Шерил Хохман

19

В своем ifпредложении в функции вы ссылаетесь на переменную strTemp, которая не существует. $strTempвсе же существует.

Но PHP уже имеет empty()доступную функцию; зачем делать свой?

if (empty($str))
    /* String is empty */
else
    /* Not empty */

С php.net:

Возвращаемые значения

Возвращает FALSE, если var имеет непустое и ненулевое значение.

Следующие вещи считаются пустыми:

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

http://www.php.net/empty


11
Не все реализации хотели бы, чтобы "0" оценивалось как пустое. И если он хотел этого, не мог бы он так же хорошо использовать сравнение if ($ x), т.е. If (! Trim ($ str))?
Calvin

1
Обратите внимание, что выполнение $ tmpStr! = '' Также вернет true, если $ tmpStr содержит 0 или false или другое пустое / ложное значение.
Пим Джагер

5
Ваша версия на самом деле не будет работать: пусто работает с переменными, а не с выражениями.
гончая

13

PHP оценивает пустую строку как false, поэтому вы можете просто использовать:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}

9
Это прекрасно работает, пока вы не наберете 0. В противном случае идея отличная, я ее использую в других местах. Спасибо за ваш ответ.
bgosalci

10

Просто используйте функцию strlen ()

if (strlen($s)) {
   // not empty
}

1
это зависит от того, как PHP реализует функцию strlen (). Например, в Delphi строка фактически сохранила свою длину минус 4 байтовых смещения, поэтому проверка ее длины тривиальна.
doctorlai

5
Не типа сохранить. Прежде Php 5.3чем функция вернется, 5если $sимеет тип array. Php > 5.3возникнет исключение. Я рекомендую использовать is_string($s) && str_len($s) > 0. >0только для чтения.
magic_al

5

Я просто пишу свою собственную функцию, is_string для проверки типов и strlen для проверки длины.

function emptyStr($str) {
    return is_string($str) && strlen($str) === 0;
}

print emptyStr('') ? "empty" : "not empty";
// empty

Вот небольшой тест repl.it

РЕДАКТИРОВАТЬ: Вы также можете использовать функцию обрезки, чтобы проверить, если строка также пуста.

is_string($str) && strlen(trim($str)) === 0;    

1

Мне нужно было проверить пустое поле в PHP и использовал

ctype_space($tempVariable)

который работал хорошо для меня.


Это правильный ответ на другой вопрос. Этот ответ НЕ проверяет, является ли строка пустой.
mickmackusa

0

Хорошо, вот короткий метод, чтобы проверить, является ли строка пустой или нет.

$input; //Assuming to be the string


if(strlen($input)==0){
return false;//if the string is empty
}
else{
return true; //if the string is not empty
}

Проверка strlen()была рекомендована в 2014 году на этой странице. Ваш ответ не добавляет никакой новой ценности.
mickmackusa

0

Вы можете просто привести к bool, не забудьте обработать ноль.

function isEmpty(string $string): bool {
    if($string === '0') {
        return false;
    }
    return !(bool)$string;
}

var_dump(isEmpty('')); // bool(true)
var_dump(isEmpty('foo')); // bool(false)
var_dump(isEmpty('0')); // bool(false)

(bool)$strто же самое, что делать !empty($str), и имеет ту же проблему с '0'. Прочтите PHP Booleans , раздел «Преобразование в логическое значение». Кроме того, вы получили это задом наперед - должно быть !(bool)$string'. Или ваша функция должна быть названа "isNotEmpty". В любом случае, вы застряли с неправильной обработкой '0'.
ToolmakerSteve

@ToolmakerSteve Для 0проблемы просто обработайте это перед возвратом приведенной строки. И большое спасибо, я забыл отрицание !(отрицательные имена функций - плохая практика). Отредактировал мой пост.
Фабиан Пикон

-1

Я знаю, что эта тема была довольно старой, но я просто хотел поделиться одной из моих функций. Эта функция ниже может проверять наличие пустых строк, строк максимальной длины, минимальной длины или точной длины. Если вы хотите проверить наличие пустых строк, просто установите $ min_len и $ max_len в 0.

function chk_str( $input, $min_len = null, $max_len = null ){

    if ( !is_int($min_len) && $min_len !== null ) throw new Exception('chk_str(): $min_len must be an integer or a null value.');
    if ( !is_int($max_len) && $max_len !== null ) throw new Exception('chk_str(): $max_len must be an integer or a null value.'); 

    if ( $min_len !== null && $max_len !== null ){
         if ( $min_len > $max_len ) throw new Exception('chk_str(): $min_len can\'t be larger than $max_len.');
    }

    if ( !is_string( $input ) ) {
        return false;
    } else {
        $output = true;
    }

    if ( $min_len !== null ){
        if ( strlen($input) < $min_len ) $output = false;
    }

    if ( $max_len !== null ){
        if ( strlen($input) > $max_len ) $output = false;
    }

    return $output;
}

-2

может ты сможешь попробовать это

if(isNotEmpty($userinput['phoneNumber']) == true)

это из-за конфигурации php в php.ini


-2

если у вас есть поле именно serial_number и вы хотите проверить пусто, то

$serial_number = trim($_POST[serial_number]);
$q="select * from product where user_id='$_SESSION[id]'";
$rs=mysql_query($q);
while($row=mysql_fetch_assoc($rs)){
if(empty($_POST['irons'])){
$irons=$row['product1'];
}

таким образом, вы можете проверить все поля в цикле с другой пустой функцией


empty()было рекомендовано на этой странице еще в 2009 году.
mickmackusa

-2

это краткое и эффективное решение, именно то, что вы ищете:

return $input > null ? 'not empty' : 'empty' ;

Я не проверял, работает ли это, но если это произойдет, это будет путем преобразования nullв пустую строку для сравнения. В этом случае было бы гораздо яснее сказать, что вы имеете в виду $input > ''. То есть «выполнить лексическое сравнение между входной строкой и пустой строкой». Или игнорировать пробелы на концах trim($input) > ''.
ToolmakerSteve

... Также нужно проверить, что происходит, когда $inputесть '0'. Не ясно, делает ли php numericили lexicalсравнение, когда первый аргумент является числовой строкой.
ToolmakerSteve

-3

Вы получили ответ, но в вашем случае вы можете использовать

return empty($input);

или

return is_string($input);

5
это не удается заempty("0")
activatedgeek

2
@geekido - сокращение количества неправильных ответов является частью StackOverflow - оно сдвигает эти ответы вниз и побуждает ответчиков исправить свой ответ или удалить его. Вы понимаете, что не так с вашим ответом? 1. empty- этот ответ уже дан, так что повторение этого ничего не даст. Хуже того, как обсуждалось в комментариях, это неправильно - любое значение, эквивалентное, 0будет считаться «пустым». 2. is_stringнеправильно по-другому - пустая строка ''является строкой, поэтому в этом случае вернет true - не может выполнить то, что задает вопрос.
ToolmakerSteve
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.