为什么检查字符串是否为空的函数总是返回true?[关闭]


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)更具可读性,否则您可以这样称呼它:if(!isNotEmpty($ x))...另一方面,isNotEmpty()和(!isEmpty())不是那不同。YMMV。
约翰多多

1
要具有不带负名称的相同功能,可能类似于hasContent()。
OsakaWebbie

!thatDifferent @johndodo
coderatchet

这绝对是题外话:错别字问题。
mickmackusa

Answers:


320

实际上是简单的问题。更改:

if (strTemp != '')

if ($strTemp != '')

可以说,您可能还想将其更改为:

if ($strTemp !== '')

因为!= ''如果传递的是数字0以及其他一些由于PHP的自动类型转换的情况,则返回true 。

不应该为此使用内置的empty()函数。请参阅注释和PHP类型比较表


4
可以将if更改为:return $ strTemp!=='';
斯特拉格

12
您不想使用empty()。考虑一串空格:$ x =“”; var_dump(!empty($ x)); / *(TRUE)/ var_dump(isNotEmpty($ x)); /(FALSE)* /
nickf

5
OP正在修剪字符串。在这种情况下,它是适当的。
cletus

8
@cletus:然后考虑一个字符串$ s ='0'。如果您调用empty($ s),它将评估为true(不是直观的恕我直言,但事实如此)。
约翰多多

28
不要使用empty()!empty()对于“ 0”之类的值将返回true。参见php.net/manual/en/types.comparisons.php
Scott Tesler

27

PHP具有一个称为empty() 测试的内置函数,可通过键入if(empty($string)){...} Reference php.net 来完成 :php空


4
空引用已经在cletus接受的答案的末尾。还可以看到该问答线程来自2009年4月。无论如何,感谢您的输入。我给您+1作为第一个答案。
regilero 2012年

64
不要使用empty()!empty()对于“ 0”之类的值将返回true。参见php.net/manual/en/types.comparisons.php
Scott Tesler

3
@ScottDavidTesler如果字符串为“ 0”,它将返回true吗?还是仅当它是整数0时?
Tomas Zubiri

5
@TomasZubiri是的,包含“ 0”的字符串将返回true。
Michael Sund

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:

返回值

如果var具有非空且非零值,则返回FALSE。

以下内容被认为是空的:

* "" (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!=也会返回$ tmpStr保持0或false或另一个空/ false值的true。
Pim Jager

5
您的版本实际上不起作用:empty对变量起作用,而不对表达式起作用。
猎犬

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$sarrayPhp > 5.3is_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

这是一个小测试

编辑:您还可以使用修剪功能来测试字符串是否也为空白。

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

您可以简单地将其转换为布尔值,不要忘记处理零。

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.ini中的php配置


-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
就已

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.