检查变量是不是为空字符串或空字符串的更好方法?

Posted

技术标签:

【中文标题】检查变量是不是为空字符串或空字符串的更好方法?【英文标题】:Better way to check variable for null or empty string?检查变量是否为空字符串或空字符串的更好方法? 【发布时间】:2010-09-27 17:34:19 【问题描述】:

既然 php 是一种动态语言,那么检查提供的字段是否为空的最佳方法是什么?

我想确保:

    null 被认为是一个空字符串 只有空格的字符串被认为是空的 “0”不被认为是空的

这是我目前得到的:

$question = trim($_POST['question']);

if ("" === "$question") 
    // Handle error here

一定有更简单的方法吗?

【问题讨论】:

我会说使用 empty($question),但这也认为 0 是空的。 尤达条件很糟糕 【参考方案1】:
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str)
    return (!isset($str) || trim($str) === '');

【讨论】:

由于 OP 要求一个极其简单的操作的“更简单”版本,我要说“更好”是真正需要的。 我把它变成了一个函数。这应该使您的验证代码更简单 这里 !isset() 的目的是什么?它与 is_null() 有何不同? 也返回 (!empty($question) || trim($question)===''); 更正我之前的评论(右括号放错位置):可以简单地做return trim($question)==='';【参考方案2】:

旧帖子,但有人可能像我一样需要它;)

if (strlen($str) == 0)
do what ever

用你的变量替换$strNULL"" 在使用 strlen 时都返回 0。

【讨论】:

而且总是有:if(strcmp('', $var) == 0)... 为什么 ==0 而不仅仅是 if (strlen($str)) ? @Noumenon 因为这会在不解决任何问题的情况下损害可读性。很容易将您的建议理解为“如果有长度”,而它(当然)意味着相反。 如果有人关心的话,对于仅包含空格的字符串将无济于事 如果未设置变量,则会产生警告【参考方案3】:

使用 PHP 的 empty() 函数。下面的东西被认为是空的

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

更多详情请查看empty function

【讨论】:

海报说他们不想考虑“0”为空【参考方案4】:

如果我错了,我会虚心接受,但我自己进行了测试,发现以下方法适用于测试 string(0) "" 和 NULL 值变量:

if ( $question ) 
  // Handle success here

也可以反过来测试是否成功:

if ( !$question ) 
  // Handle error here

【讨论】:

我可以建议“if (trim($n))..”,否则如果 $_POST var(例如)只是“”,它会被认为是有效的,而在大多数情况下,这和空字符串一样好 如果 " " 不是特定函数的可接受值,那么使用 trim 将是一个好主意。 这将为“0”、数字 0 或 0.0 和 FALSE 返回 false。【参考方案5】:

当心来自trim() 函数的误报——它在修剪之前执行转换为字符串,因此将返回例如“数组”,如果你传递一个空数组。这可能不是问题,具体取决于您处理数据的方式,但使用您提供的代码,可以在 POST 数据中提供名为 question[] 的字段,并且看起来是一个非空字符串。相反,我会建议:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) 
    // Handle error here


// If $question was a string, it will have been trimmed by this point

【讨论】:

我说如果你得到一个你期望字符串的数组,它应该是一个错误。如果你期望一个数组,那么你应该有一个单独的过滤函数。 那段代码不是将其视为错误吗?如果在其他地方进行过滤,则必须注意不要将 args 验证规则的知识复制到不同的地方。【参考方案6】:

没有更好的方法,但由于这是您通常经常执行的操作,因此您最好将流程自动化。

大多数框架都提供了一种使参数解析变得简单的方法。您可以为此构建自己的对象。快速而肮脏的例子:

class Request


    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    
         if ($from) :
             if (isset($'_'.$from[$key]));
                return sanitize($'_'.strtoupper($from)[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    
          return addslashes(trim($data));
    

    // your rules here
    function isEmptyString($data)
    
        return (trim($data) === "" or $data === null);
    


    function exists($key) 

    function setFlash($name, $value) 

    [...]



$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

Symfony 大量使用这种糖。

但您所说的不止于此,您的 "// 此处处理错误 “。您正在混合 2 个工作:获取数据并处理它。这根本不一样。

您可以使用其他机制来验证数据。同样,框架可以向您展示最佳实践。

创建代表表单数据的对象,然后附加进程并回退到它。这听起来比破解一个快速的 PHP 脚本要做的工作要多得多(这是第一次),但它是可重用的、灵活的,而且更不容易出错,因为使用普通 PHP 进行的表单验证往往会很快变成意大利面条代码。

【讨论】:

你做的与他想要的完全相反......简单。【参考方案7】:

这个检查数组字符串:

function is_set($val) 
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;

【讨论】:

不错。 PHPst 的答案是一样的,但更简洁。【参考方案8】:

为了更健壮(制表、返回……),我定义:

function is_not_empty_string($str) 
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;


// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) 
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");

来源:

https://www.php.net/manual/en/function.is-string.php https://www.php.net/manual/en/function.trim.php

【讨论】:

【参考方案9】:

当您要检查是否为某个字段提供了值时,该字段可能是 stringarray 或未定义的。所以,以下就足够了

function isSet($param)

    return (is_array($param) && count($param)) || trim($param) !== '';

【讨论】:

【参考方案10】:

empty() 曾经为此工作,但 empty() 的行为已经改变了好几次。与往常一样,php 文档始终是准确行为的最佳来源,并且这些页面上的 cmets 通常提供了随时间变化的良好历史记录。如果要检查是否缺少对象属性,目前一个非常防御的方法是:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) 

【讨论】:

以上是关于检查变量是不是为空字符串或空字符串的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

javascript检查空字符串或空字符串[重复]

检查字符串是不是为空或为空的最简单方法

空字符串或空变量的 JSON 标准是啥?

从数组中删除空字符串或空白字符串 - Javascript

如何检查@RequestMapping 参数中的请求参数是不是为空字符串?

改造:处理可以是空字符串或数组的属性