Чому функція перевірки, чи рядок порожній, завжди повертає істину? [зачинено]


231

У мене є функція isNotEmpty, яка повертає true, якщо рядок не порожня, а false, якщо рядок порожній. Я з’ясував, що він не працює, якщо через нього пропускаю порожню рядок.

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), інакше ви можете назвати її так: якщо (! IsNotEmpty ($ x)) ... З іншого боку, isNotEmpty () і (! IsEmpty ()) не є що різні. YMMV.
johndodo

1
Щоб мати ту саму функцію без заперечного імені, можливо, щось на зразок hasContent ().
OsakaWebbie

! thatDifferent @johndodo
coderatchet

Це визначено поза темою: друкарське запитання.
mickmackusa

Відповіді:


320

Фактично проста проблема. Змінити:

if (strTemp != '')

до

if ($strTemp != '')

Можливо, ви також можете змінити його на:

if ($strTemp !== '')

оскільки != ''повернеться істинним, якщо ви пройдете числовий 0 та кілька інших випадків через автоматичне перетворення типу PHP .

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


4
Можливо, змініть if на: return $ strTemp! == '';
страгер

12
ви не хочете використовувати порожній (). Розглянемо рядок пробілів: $ x = ""; var_dump (! порожній ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (
ФАЛЬС

5
ОП - це обрізка струни. У цьому випадку її доречно.
клетус

8
@cletus: тоді розглянемо рядок $ s = '0'. Якщо ви зателефонуєте порожнім ($ s), він оцінить справжній (не інтуїтивний imho, але це так).
johndodo

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

27

PHP мають вбудовану функцію під назвою empty() тест робиться шляхом введення if(empty($string)){...} довідки php.net: php порожній


4
порожнє посилання вже в кінці прийнятої відповіді від клету. Подивіться також, що це питання та відповіді - з квітня 2009 року. У будь-якому випадку дякую за ваш внесок. Я даю вам +1 за першу відповідь.
regilero

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

3
@ScottDavidTesler Якщо рядок "0" повернеться як true? Або лише якщо це ціле число 0?
Томаш Зубірі

5
@TomasZubiri Так, рядок, що містить "0", поверне вірно.
Майкл Сунд

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)якщо вимикається. Після вимкнення будь-якого наступного .не буде відповідати новій лінії. якщо ви хочете ввімкнути / вимкнути вимикач вбудованим (вбудованим всередину регулярного виразу) замість прапора регулярного виразка.
SherylHohman

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))?
Кальвін

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
Не введіть Save. Перед тим, 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

EDIT: Ви також можете використовувати функцію обрізки, щоб перевірити, чи рядок також порожній.

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-булі , розділ "Перетворення на булеві". Також ти отримав це назад - повинно бути !(bool)$string'. Або ваша функція повинна бути названа "isNotEmpty". Незважаючи на те, ви застрягли в неправильному поводженні з "0".
ToolmakerSteve

@ToolmakerSteve Для 0проблеми просто вирішіть це перед тим, як повернути закинутий рядок. І велике спасибі, я забув заперечення !(заперечені назви функцій - це погана практика). Редагував мою публікацію.
Fabian Picone

-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")
активізуватись

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