文字列が空かどうかをチェックする関数が常にtrueを返すのはなぜですか?[閉まっている]


231

文字列が空でない場合はtrueを返し、文字列が空の場合はfalseを返すisNotEmpty関数があります。空の文字列を渡すと機能しないことがわかりました。

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

文字列が空の場合、elseは実行されません。理由はわかりません。誰かがこれに光を当ててください。


55
ただの提案です:否定された名前で関数を使用することは一般的に悪い習慣です。isEmpty($ input)関数の方が読みやすく、そうでない場合は次のように呼び出すことができます:if(!isNotEmpty($ x))...一方、isNotEmpty()および(!isEmpty())は違います。YMMV。
johndodo '27年

1
名前を否定せずに同じ関数を使用するには、おそらくhasContent()のようにします。
OsakaWebbie

!thatDifferent @johndodo
coderatchet

これは間違いなくオフトピック:タイポの質問です。
mickmackusa

回答:


320

実際には単純な問題。変化する:

if (strTemp != '')

if ($strTemp != '')

間違いなく、次のように変更することもできます。

if ($strTemp !== '')

以来、!= ''あなたが渡す場合はtrueを返します0の数字とに起因する他のいくつかの例であるPHPの自動型変換

あなたはないはず内蔵の使用(空を)関数を。コメントとPHPの型比較表を参照してください。


4
間違いなく、if intoを次のように変更します。return $ strTemp!== '';
ストレージャー、2009

12
empty()を使用したくない。スペースの文字列を考えてみましょう:$ x = ""; var_dump(!empty($ x)); / *(TRUE)/ var_dump(isNotEmpty($ x)); /(FALSE)* /
nickf 2009

5
OPが文字列をトリミングしています。この場合は適切です。
cletus 2009

8
@cletus:次に、文字列$ s = '0'を検討します。empty($ s)を呼び出すと、trueと評価されます(直感的ではありませんが、そうです)。
johndodo '27年

28
empty()は使用しないでください!empty()は、「0」などの値に対してtrueを返します。php.net/manual/en/types.comparisons.phpをご覧ください
Scott Tesler

27

PHPにはempty() 、テストと呼ばれる組み込み関数があります。「 if(empty($string)){...} リファレンスphp.net:php empty


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 2016年

5
@TomasZubiriはい、「0」を含む文字列はtrueを返します。
マイケルサンド2017

3
この誤解に賛成する人は他にいません-上記のコメントを読んでください!
ToolmakerSteve

24

私は常に空の文字列をチェックするために正規表現を使用し、CGI / Perlの時代にさかのぼり、さらにJavaScriptを使用しているので、PHPを使用しないのはなぜですか(例:(未テスト))

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

ここで、\ Sは空白以外の文字を表します


1
これは、ゼロが空の文字列と同じであると想定しない唯一の解決策です!
マシューロック

1
クールなソリューション。余談です.[\s\S]/sstackoverflow.com / a / 4544642/5411817は次のように述べていますこれはJavaScriptでは一般的ですが、PHPではフラグを使用してドットをすべての文字に一致させることができますそして、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
あなたのバージョンは実際には機能しません:空は式ではなく変数で機能します。
ハウンド

13

PHPは空の文字列をfalseと評価するため、次のように使用できます。

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

9
これは、あなたがpas 0になるまでうまく機能します。そうでなければ、アイデアは素晴らしいですが、他のいくつかの場所でそれを使用します。御返答いただき有難うございます。
bgosalci 2009

10

strlen()関数を使用するだけ

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

1
PHPがstrlen()関数をどのように実装するかによって異なります。たとえば、Delphiでは、文字列は実際にはその長さから4バイトのオフセットを差し引いたものを格納しているため、長さのチェックは簡単です。
doctorlai 2015年

5
saveと入力しないでください。Php 5.3関数のタイプがの5場合、関数が戻る前。例外が発生します。の使用をお勧めします。ただ読む目的で。$sarrayPhp > 5.3is_string($s) && str_len($s) > 0>0
magic_al 2016年

5

型チェック用のis_stringと、長さをチェックするためのstrlen関数を書くだけです。

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

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

ここに小さなテストrepl.itがあります

編集:トリム関数を使用して、文字列も空白かどうかをテストすることもできます。

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

私はこのスレッドがかなり古いことを知っていますが、私の機能の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年に、このページの裏に推奨されていました
mickmackusa

-2

これは短くて効果的なソリューションであり、まさにあなたが探しているものです:

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

これが機能するかどうかはテストしていませんが、機能する場合は、null比較のために空の文字列に変換します。その場合には、あなたが何を意味するかと言うことより明確になります: $input > ''。つまり、「入力文字列と空の文字列の字句比較を実行します」。または、末尾の空白を無視するには:trim($input) > ''
ToolmakerSteve

...また、ときに何が起こるかをテストする必要が$inputあります'0'。最初の引数が数値文字列である場合、phpがnumericlexical比較かを明確にしません。
ToolmakerSteve

-3

あなたは答えを得ましたが、あなたの場合あなたは使うことができます

return empty($input);

または

return is_string($input);

5
これは、ために失敗したempty("0")
activatedgeek

2
@geekido-間違った回答の反対投票はStackOverflowの一部です-それはそれらの回答を下に移動し、回答者に回答を修正または削除するように促します。あなたの答えの何が悪いのか理解していますか?1.- emptyこの答えはすでに与えられているので、もう一度言っても何も貢献しません。さらに悪いことに、コメントで説明したように、それは誤りです。同等の値はすべて0「空」と見なされます。2. is_string別の方法で間違っている-空の文字列''は文字列なので、その場合はtrueを返します-質問の質問に答えません。
ToolmakerSteve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.