Tại sao một hàm kiểm tra nếu một chuỗi rỗng luôn trả về true? [đóng cửa]


231

Tôi có một hàm isNotEmpty trả về true nếu chuỗi không rỗng và false nếu chuỗi rỗng. Tôi đã phát hiện ra rằng nó không hoạt động nếu tôi chuyển một chuỗi rỗng qua nó.

function isNotEmpty($input) 
{
    $strTemp = $input;
    $strTemp = trim($strTemp);

    if(strTemp != '') //Also tried this "if(strlen($strTemp) > 0)"
    {
         return true;
    }

    return false;
}

Việc xác thực chuỗi bằng isNotEmpty được thực hiện:

if(isNotEmpty($userinput['phoneNumber']))
{
    //validate the phone number
}
else
{
    echo "Phone number not entered<br/>";
}

Nếu chuỗi trống mà người khác không thực thi, tôi không hiểu tại sao, ai đó có thể vui lòng làm sáng tỏ điều này không.


55
Chỉ là một gợi ý: nói chung việc sử dụng các hàm với tên bị phủ định là một cách thực hành tồi. Có thể dễ đọc hơn khi có hàm isEmpty ($ input), nếu không bạn có thể gọi nó như thế này: if (! IsNotEmpty ($ x)) ... Mặt khác, isNotEmpty () và (! IsEmpty ()) không khác nhau YMMV.
johndodo

1
Để có cùng chức năng mà không có tên bị phủ định, có lẽ một cái gì đó như hasContent ().
OsakaWebbie

! thatDifferent @johndodo
coderatchet

Đây là một vấn đề không chính xác: câu hỏi Typo .
mickmackusa

Câu trả lời:


320

Vấn đề đơn giản thực sự. Thay đổi:

if (strTemp != '')

đến

if ($strTemp != '')

Có thể cho rằng bạn cũng có thể muốn thay đổi nó thành:

if ($strTemp !== '')

!= ''sẽ trả về true nếu bạn vượt qua là số 0 và một vài trường hợp khác do chuyển đổi loại tự động của PHP .

Bạn không nên sử dụng hàm rỗng () tích hợp cho việc này; xem bình luận và các bảng so sánh kiểu PHP .


4
Có thể cho phép, thay đổi if thành: return $ strTemp! == '';
strager

12
bạn không muốn sử dụng sản phẩm nào (). Hãy xem xét một chuỗi các khoảng trắng: $ x = ""; var_dump (! trống ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
OP đang cắt xén chuỗi. Trong trường hợp này thích hợp của nó.
cletus

8
@cletus: sau đó xem xét một chuỗi $ s = '0'. Nếu bạn gọi trống ($ s), nó sẽ đánh giá là đúng (không phải imho trực quan, nhưng nó là như vậy).
johndodo

28
Đừng sử dụng sản phẩm nào ()! khoảng trống () sẽ trả về true cho các giá trị, chẳng hạn như '0'. Xem
php.net/manual/en/types.comparisons.php

27

PHP có một hàm dựng sẵn gọi là empty() kiểm tra được thực hiện bằng cách gõ if(empty($string)){...} Reference php.net: php rỗng


4
tài liệu tham khảo trống đã ở cuối câu trả lời được chấp nhận từ cletus. Cũng thấy rằng câu hỏi và câu trả lời này là từ tháng tư năm 2009. Dù sao cũng cảm ơn cho đầu vào của bạn. Tôi sẽ cho bạn +1 cho câu trả lời đầu tiên.
regilero

64
Đừng sử dụng sản phẩm nào ()! khoảng trống () sẽ trả về true cho các giá trị, chẳng hạn như '0'. Xem php.net/manual/en/types.comparisons.php
Scott Tesler

3
@ScottDavidTesler Nếu chuỗi là "0" thì nó có trả về đúng không? Hoặc chỉ khi nó là số nguyên 0?
Tomas Zubiri

5
@TomasZubiri Có, một chuỗi chứa "0" sẽ trả về true.
Michael Sund ngày

3
XIN VUI LÒNG, không ai khác nêu lên câu trả lời SAU này - đọc các bình luận trên!
ToolmakerSteve

24

Tôi luôn sử dụng một biểu thức chính quy để kiểm tra một chuỗi trống, có từ ngày CGI / Perl và cả với Javascript, vậy tại sao không phải với PHP, ví dụ: (mặc dù chưa được kiểm tra)

return preg_match('/\S/', $input);

Trong đó \ S đại diện cho bất kỳ ký tự không phải khoảng trắng


1
Đây là giải pháp duy nhất ở đây không cho rằng số 0 giống như một chuỗi rỗng!
Khóa Matthew

1
Dung dịch mát. Là một lưu ý phụ, stackoverflow.com/a/4544642/5411817 đề cập: Theo mặc định .không khớp với các dòng mới - [\s\S]là một hack xung quanh vấn đề đó. Điều này là phổ biến trong JavaScript, nhưng trong PHP bạn có thể sử dụng /scờ để làm cho dấu chấm khớp với tất cả các ký tự. stackoverflow.com/a/4544646/5411817 đề cập: (?s)bật schế độ và (?-s)tắt nếu tắt. Sau khi tắt bất kỳ sau đây .sẽ không phù hợp với một dòng mới. nếu bạn muốn bật / tắt công tắc nội tuyến (được nhúng bên trong regex) thay vì làm cờ regex.
SherylHohman

19

Trong ifmệnh đề của bạn trong hàm, bạn đang đề cập đến một biến strTempkhông tồn tại. $strTempkhông tồn tại, mặc dù.

Nhưng PHP đã có sẵn một empty()chức năng; Tại sao làm cho riêng bạn?

if (empty($str))
    /* String is empty */
else
    /* Not empty */

Từ php.net:

Giá trị trả về

Trả về FALSE nếu var có giá trị không rỗng và khác không.

Những điều sau đây được coi là trống rỗng:

* "" (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
Không phải tất cả các triển khai đều muốn "0" được đánh giá là trống. Và nếu anh ta muốn điều đó, anh ta cũng không thể sử dụng phép so sánh if ($ x) tức là If (! Trim ($ str))?
Calvin

1
Lưu ý rằng việc thực hiện $ tmpStr! = '' Cũng sẽ trả về true của $ tmpStr giữ 0 hoặc sai hoặc giá trị trống / sai khác.
Pim Jager

5
Phiên bản của bạn sẽ không thực sự hoạt động: trống hoạt động trên các biến, không phải trên biểu thức.
Chó săn

13

PHP đánh giá một chuỗi rỗng thành false, vì vậy bạn chỉ cần sử dụng:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}

9
Điều này hoạt động tốt cho đến khi bạn vượt qua 0. Nếu không, ý tưởng là tuyệt vời, tôi sẽ cho chúng tôi biết nó ở một số nơi khác. Cám ơn phản hồi của bạn.
bgosalci

10

Chỉ cần sử dụng hàm strlen ()

if (strlen($s)) {
   // not empty
}

1
nó phụ thuộc vào cách PHP thực hiện hàm strlen (). Ví dụ, trong Delphi, chuỗi thực sự đã lưu trữ độ dài của nó trừ đi 4 byte bù, vì vậy việc kiểm tra độ dài của nó là không đáng kể.
Doctorlai

5
Không gõ tiết kiệm. Trước khi Php 5.3hàm sẽ trả về 5nếu $slà loại array. Php > 5.3sẽ tăng một ngoại lệ. Tôi khuyên bạn nên sử dụng is_string($s) && str_len($s) > 0. >0chỉ dành cho mục đích đọc.
Magic_al 10/03/2016

5

Tôi chỉ viết hàm riêng của mình, is_ chuỗi để kiểm tra kiểu và strlen để kiểm tra độ dài.

function emptyStr($str) {
    return is_string($str) && strlen($str) === 0;
}

print emptyStr('') ? "empty" : "not empty";
// empty

Đây là một thử nghiệm nhỏ thay thế.

EDIT: Bạn cũng có thể sử dụng chức năng trim để kiểm tra nếu chuỗi cũng trống.

is_string($str) && strlen(trim($str)) === 0;    

1

Tôi cần kiểm tra một trường trống trong PHP và đã sử dụng

ctype_space($tempVariable)

mà làm việc tốt cho tôi


Đây là một câu trả lời đúng cho một câu hỏi khác. Câu trả lời này KHÔNG kiểm tra nếu một chuỗi trống.
mickmackusa

0

Vâng đây là phương pháp ngắn để kiểm tra xem chuỗi có trống hay không.

$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
}

Kiểm tra strlen()đã được đề nghị trong năm 2014 trên trang này. Câu trả lời của bạn không thêm giá trị mới.
mickmackusa

0

Bạn chỉ có thể chuyển sang bool, đừng quên xử lý zero.

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)$strcũng giống như làm !empty($str), và có cùng một vấn đề với '0'. Đọc Booleans PHP , phần "Chuyển đổi sang boolean". Ngoài ra, bạn đã nhận nó ngược - nên được !(bool)$string'. Hoặc chức năng của bạn nên được đặt tên là "isNotEmpty". Bất kể, bạn đang bị mắc kẹt với việc xử lý '0' không chính xác.
ToolmakerSteve

@ToolmakerSteve Đối với 0vấn đề, chỉ cần xử lý vấn đề đó trước khi trả về chuỗi được đúc. Và cảm ơn rất nhiều, tôi đã quên đi sự phủ định !(tên hàm bị phủ định là thực tiễn xấu). Chỉnh sửa bài viết của tôi.
Fabian Picon

-1

Tôi biết chủ đề này đã khá cũ nhưng tôi chỉ muốn chia sẻ một trong những chức năng của tôi. Hàm này bên dưới có thể kiểm tra các chuỗi trống, chuỗi có độ dài tối đa, độ dài tối thiểu hoặc độ dài chính xác. Nếu bạn muốn kiểm tra các chuỗi trống, chỉ cần đặt $ min_len và $ max_len là 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

có lẽ bạn có thể thử cái này

if(isNotEmpty($userinput['phoneNumber']) == true)

đó là do cấu hình php trong php.ini


-2

nếu bạn có một trường cụ thể là serial_number và muốn kiểm tra trống thì

$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'];
}

bằng cách này, bạn có thể chọn tất cả các tệp trong vòng lặp với một hàm trống khác


empty()đã được đề xuất trên trang này vào năm 2009.
mickmackusa

-2

đây là giải pháp ngắn và hiệu quả, chính xác là những gì bạn đang tìm kiếm:

return $input > null ? 'not empty' : 'empty' ;

Tôi đã không kiểm tra xem cái này có hoạt động không, nhưng nếu có, nó sẽ bằng cách chuyển đổi nullthành chuỗi rỗng để so sánh. Trong trường hợp đó, sẽ rõ ràng hơn nhiều khi nói ý của bạn : $input > ''. Đó là "thực hiện so sánh từ vựng giữa chuỗi đầu vào và chuỗi rỗng". Hoặc để bỏ qua khoảng trắng ở cuối : trim($input) > ''.
ToolmakerSteve

... Cũng cần phải kiểm tra những gì sẽ xảy ra khi $input'0'. Không rõ liệu php có thực hiện numerichoặc lexicalso sánh hay không , khi đối số đầu tiên là một chuỗi số.
ToolmakerSteve

-3

Bạn đã có câu trả lời nhưng trong trường hợp của bạn, bạn có thể sử dụng

return empty($input);

hoặc là

return is_string($input);

5
điều này không choempty("0")
activatedgeek

2
@geekido - bỏ qua các câu trả lời sai là một phần của StackOverflow - nó di chuyển những câu trả lời đó xuống và khuyến khích người trả lời sửa câu trả lời của họ hoặc xóa nó. Bạn có hiểu những gì sai với câu trả lời của bạn? 1. empty- câu trả lời này đã được đưa ra, vì vậy nói lại nó không đóng góp gì cả. Tồi tệ hơn, như đã được thảo luận trong các bình luận, đó là sai - mọi giá trị tương đương 0sẽ được coi là "trống rỗng". 2. is_stringsai theo một cách khác - một chuỗi rỗng ''là một chuỗi, do đó sẽ trả về true trong trường hợp đó - không thực hiện được những gì câu hỏi yêu cầu.
ToolmakerSteve
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.