簡體   English   中英

PHP檢查字符串是否為空的最佳方法

[英]PHP best way to check whether a string is empty or not

我見過很多 php 代碼,它們執行以下操作來檢查字符串是否有效:

$str 是一個字符串變量。

if (!isset($str) || $str !== '') {
  // do something
}

我更喜歡做

if (strlen($str) > 0) {
  // something
}

第二種方法有什么問題嗎? 有什么我應該注意的鑄造問題嗎?

由於 PHP 會將包含零 ('0') 的字符串視為空字符串,這使得empty()函數成為不合適的解決方案。

相反,測試變量是否顯式不等於空字符串:

$stringvar !== ''

正如OPGras Double和其他人所示,還應檢查變量的初始化以避免警告或錯誤(取決於設置):

isset($stringvar)

這導致更容易接受:

if (isset($stringvar) && $stringvar !== '') {
}

PHP 有很多不好的約定。 我最初使用empty()函數回答了這個問題(9 多年前),如下所示。 我早就放棄了 PHP,但由於這個答案每隔幾年就會吸引反對票和評論,我已經更新了它。 如果 OP 希望更改已接受的答案,請這樣做。

原答案:

 if(empty($stringvar)) { // do something }

如果要考慮,您還可以添加trim()以消除空格。

編輯:

請注意,對於像“ 0 ”這樣的字符串,這將返回 true,而strlen()則不會。

您需要isset()以防$str可能未定義:

if (isset($str) && $str !== '') {
    // variable set, not empty string
}

使用!empty()會有一個重要的警告:字符串'0'計算結果為 false


此外,有時人們還想檢查一下, $str不是false ,比如falsenull [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 比較不是可傳遞的(包括有趣的圖表)。


[1] 請注意, isset()已經過濾掉了null

這將安全地檢查只包含空格的字符串:

// 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));
}

這個怎么樣:

if( !isset($str[0]) )
   echo "str is NULL or an empty string";

我在Antone Roundy的評論中在 PHP 手冊上找到了它

我把它貼在這里,因為我做了一些測試,它似乎工作得很好,但我想知道是否有一些我沒有考慮的副作用。 在這里評論中的任何建議將不勝感激。

根據 PHP empty() 文檔( http://ca1.php.net/empty ):

在 PHP 5.5 之前,empty() 只支持變量; 其他任何事情都會導致解析錯誤。 換句話說,以下內容將不起作用:empty(trim($name))。

相反,使用 trim($name) == false

這個簡單的老問題仍然很棘手。

strlen($var)僅在您絕對確定 $var 是字符串時strlen($var)完美運行。

isset($var)empty($var)結果基於變量的類型,在某些情況下可能會很棘手(例如空字符串“”)。 查看此頁面中的表格以獲取更多詳細信息。

更新

這個問題實際上有兩種情況:

案例 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 個條件下(如果您在相同的 if 條件下測試超過 1 個字符串特別有用),我將其設置為函數:

function isNonEmptyString($var) {
    return is_string($var) && $var !== '';
}


// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
    // do something
}

如果您的變量$str未定義,那么您的strlen()方法將引發異常。 這就是首先使用isset()的全部目的。

如果有帶有空格的字符串,修剪字符串也會有所幫助。

if (isset($str) &&  trim($str) !== '') {
    // code
}

我認為不是,因為 strlen (string lenght) 返回 $str 變量的長度 (整數)。 因此,如果變量為空,我將返回 0。0 是否大於 0。不要這么認為。 但我認為第一種方法可能更安全一些。 因為它會檢查變量是否為 init,以及是否為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM