我看过很多php代码执行以下操作来检查字符串是否有效:
$ str是一个字符串变量。
if (!isset($str) || $str !== '') {
// do something
}
我更喜欢做
if (strlen($str) > 0) {
// something
}
第二种方法有什么问题吗?我应该注意哪些铸造问题?
答案 0 :(得分:27)
if(empty($stringvar))
{
// do something
}
如果要考虑空格,您还可以添加trim()
来消除空格。
修改强>
请注意,对于像“0
”这样的字符串,这将返回true,而strlen()
则不会。
答案 1 :(得分:13)
如果isset()
可能未定义,则需要$str
:
if (isset($str) && $str !== '') {
// variable set, not empty string
}
使用!empty()
会有一个重要的警告:字符串'0'
evaluates to false。
此外,有时候有人想检查$str
是不是虚假的东西,如false
或null
[1]。以前的代码没有处理这个问题。这是松散比较可能有用的罕见情况之一:
if (isset($str) && $str != '') {
// variable set, not empty string, not falsy
}
上述方法很有意思,因为它仍然简明扼要,不会过滤掉'0'
。但如果您使用它,请务必记录您的代码。
否则,您可以使用此等效但更详细的版本:
if (isset($str) && (string) $str !== '') {
// variable set, not empty string, not falsy
}
当然,如果您确定$str
已定义,则可以省略上述代码中的isset($str)
。
最后,考虑到'' == false
,'0' == false
,但'' != '0'
,您可能已经猜到了:PHP comparisons aren't transitive(包括有趣的图表)。
[1]请注意,isset()
已过滤掉null
。
答案 2 :(得分:6)
这将安全地检查只包含空格的字符串:
// Determines if the supplied string is an empty string.
// Empty is defined as null or containing only whitespace.
// '0' is NOT an empty string!
function isEmptyString($str) {
return !(isset($str) && (strlen(trim($str)) > 0));
}
答案 3 :(得分:3)
这个怎么样:
if( !isset($str[0]) )
echo "str is NULL or an empty string";
的评论中在PHP手册中找到了它
我在这里发布,因为我做了一些测试,似乎运作良好,但我想知道是否有一些副作用我不考虑。在此评论中的任何建议都将不胜感激。
修改强>
如Gras Double所述,当$str
为'0'
时,上述代码将返回true。所以这个解决方案也不能很好地工作。
答案 4 :(得分:2)
根据PHP empty()doc(http://ca1.php.net/empty):
在PHP 5.5之前,empty()仅支持变量;其他任何东西都会导致解析错误。换句话说,以下将不起作用:empty(trim($ name))。
使用trim($ name)== false 。
答案 5 :(得分:1)
如果未定义变量$str
,则strlen()
方法将引发异常。这是首先使用isset()
的全部目的。
答案 6 :(得分:1)
这个简单的老问题仍然很棘手。
strlen($var)
只有在你完全确定$ var是一个字符串时才能正常工作。
isset($var)
和empty($var)
结果基于变量的类型,在某些情况下可能会很棘手(例如空字符串“”)。查看此page中的表格了解详情。
<强>更新强>
这个问题实际上有2个案例:
案例1:您确定您的变量始终将成为“字符串”:
在这种情况下,只需测试长度:
if(strlen($str) > 0) {
// do something..
}
案例2:您的变量可能<也不是是“字符串”:
在这种情况下,这取决于你想做什么。对我来说(大部分时间),如果它不是字符串,那么我将其验证为“false”。你可以这样做:
if(is_string($var) && $var !== '') {// true only if it's a string AND is not empty
// do something ...
}
并且使它变短并处于1状态而不是2(如果你在相同条件下测试超过1个字符串时特别有用),我将其变为功能:
function isNonEmptyString($var) {
return is_string($var) && $var !== '';
}
// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
// do something
}
答案 7 :(得分:0)
如果字符串带有空格,修剪字符串也会有所帮助。
if (isset($str) && trim($str) !== '') {
// code
}
答案 8 :(得分:-3)
我认为不是,因为strlen(string lenght)返回$ str变量的长度(整数)。 因此,如果变量为空,我将返回0.是0大于0.不要这么认为。 但我认为第一种方法可能会更安全一些。因为它检查变量是否为init,以及它是否为空。