문자열이 비어 있는지 확인하는 함수가 항상 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/>";
}

문자열이 비어 있으면 다른 것이 실행되지 않습니다. 왜 그런지 이해할 수 없습니다. 누군가 가이 내용을 밝힐 수 있습니까?


55
단지 제안 : 부정한 이름의 함수를 사용하는 것은 일반적으로 나쁜 습관입니다. isEmpty ($ input) 함수를 사용하는 것이 더 읽기 쉽습니다. 그렇지 않으면 다음과 같이 호출 할 수 있습니다. 다른. YMMV.
johndodo

1
부정한 이름없이 동일한 함수를 가지려면 hasContent ()와 같은 것입니다.
OsakaWebbie

! thatDifferent @johndodo
coderatchet

이것은 논외 주제 : 오타 질문입니다.
mickmackusa

답변:


320

실제로 간단한 문제. 변화:

if (strTemp != '')

if ($strTemp != '')

아마도 당신은 그것을 다음과 같이 바꾸고 싶을 수도 있습니다 :

if ($strTemp !== '')

이후 != ''당신이 통과하면 true를 돌려줍니다 0 숫자와 인해 약간 다른 경우입니다 PHP의 자동 형 변환 .

이를 위해 내장 empty () 함수를 사용 해서는 안됩니다 . 주석 및 PHP 유형 비교표를 참조하십시오 .


4
틀림없이 if를 다음과 같이 변경하십시오. return $ strTemp! == '';
strager

12
empty ()를 사용하고 싶지 않습니다. 공백 문자열을 고려하십시오. $ x = ""; var_dump (! empty ($ x)); / * (참) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
OP가 문자열을 다듬고 있습니다. 이 경우에는 적절합니다.
cletus

8
@cletus : 그런 다음 문자열 $ s = '0'을 고려하십시오. empty ($ s)를 호출하면 true로 평가됩니다 (직관적 인 imho는 아니지만 그렇게됩니다).
johndodo

28
empty ()를 사용하지 마십시오! empty ()는 '0'과 같은 값에 대해 true를 반환합니다. php.net/manual/en/types.comparisons.php 참조
Scott Tesler

27

PHP는 Reference php.net : php empty를empty() 입력하여 테스트 라는 내장 함수를 가지고 있습니다if(empty($string)){...}


4
빈 참조는 이미 cletus의 허용 된 답변 끝에 있습니다. 이 질문과 답변 스레드는 2009 년 4 월에 작성된 것입니다. 첫 번째 답변에 +1을드립니다.
regilero 2019 년

64
empty ()를 사용하지 마십시오! empty ()는 '0'과 같은 값에 대해 true를 반환합니다. php.net/manual/en/types.comparisons.php
Scott Tesler

3
@ScottDavidTesler 문자열이 "0"이면 true를 반환합니까? 또는 정수 0 인 경우에만?
Tomas Zubiri

5
@TomasZubiri 예, "0"을 포함하는 문자열은 true를 반환합니다.
Michael Sund

3
아무도이 잘못된 답변을 찬성하지 마십시오-위의 의견을 읽으십시오!
ToolmakerSteve

24

나는 항상 빈 문자열을 확인하고 CGI / Perl 일과 Javascript를 사용하여 정규 표현식을 사용하므로 PHP를 사용하지 않는 이유는 무엇입니까?

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

여기서 \ S는 공백이 아닌 문자를 나타냅니다.


1
이것은 0이 빈 문자열과 같다고 가정하지 않는 유일한 솔루션입니다!
Matthew Lock

1
멋진 솔루션. 참고로 stackoverflow.com/a/4544642/5411817은 다음과 같이 언급합니다. 기본적으로 .새 줄과 일치하지 않습니다 [\s\S].이 문제를 해결하기위한 해킹입니다. 이것은 JavaScript에서 일반적이지만 PHP에서는 /s플래그를 사용하여 점이 모든 문자와 일치하도록 할 수 있습니다 . 그리고 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에 비어 있지 않고 0이 아닌 값이 있으면 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))를 사용할 수 없었습니까?
Calvin

1
$ tmpStr! = ''을 수행하면 $ tmpStr이 0을 보유하거나 false 또는 다른 빈 / 거짓 값을 보유한 경우에도 true를 리턴합니다.
Pim Jager

5
버전이 실제로 작동하지 않습니다. 빈은 표현식이 아닌 변수에서 작동합니다.
Hound

13

PHP는 빈 문자열을 false로 평가하므로 간단하게 사용할 수 있습니다.

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

9
이것은 당신이 0 시가 될 때까지 잘 작동합니다. 그렇지 않으면 아이디어가 훌륭합니다. 다른 곳에서 우리에게 알려 드리겠습니다. 답변 주셔서 감사합니다.
bgosalci 2009

10

strlen () 함수를 사용하십시오.

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

1
PHP가 strlen () 함수를 어떻게 구현하는지에 달려 있습니다. 예를 들어, Delphi에서 문자열은 실제로 길이에서 4 바이트 오프셋을 뺀 값을 저장하므로 길이를 확인하는 것은 쉽지 않습니다.
doctorlai

5
저장하지 않습니다. 유형이 인 경우 Php 5.3함수가 반환 되기 전에 . 예외가 발생합니다. 을 사용하는 것이 좋습니다 . 읽기 전용입니다. 5$sarrayPhp > 5.3is_string($s) && str_len($s) > 0>0
magic_al

5

난 그냥 내 자신의 함수를 작성 is_string 유형 검사과 나 strlen 길이를 확인 할 수 있습니다.

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

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

다음은 작은 테스트 반복입니다.

편집 : 트림 기능을 사용 하여 문자열도 비어 있는지 테스트 할 수도 있습니다 .

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

당신은 단순히 bool로 캐스팅 할 수 있습니다. 제로를 처리하는 것을 잊지 마십시오.

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

이 스레드는 꽤 오래되었지만 내 기능 중 하나를 공유하고 싶었습니다. 아래의이 함수는 빈 문자열, 최대 길이의 문자열, 최소 길이 또는 정확한 길이를 확인할 수 있습니다. 빈 문자열을 확인하려면 $ 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'];
}

이 방법으로 다른 빈 함수를 사용하여 루프의 모든 파일을 che 수 있습니다


empty()
mickmackusa

-2

이것이 바로 당신이 찾고있는 짧고 효과적인 솔루션입니다.

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

나는 이것이 작동하는지 테스트하지 않았지만, 그렇다면 null비교를 위해 빈 문자열 로 변환하는 것 입니다. 어떤 경우에, 당신이 의미하는 바를 말하는 것이 훨씬 더 명확합니다 : $input > ''. 즉, "입력 문자열과 빈 문자열 사이의 어휘 비교"를 수행하십시오. 또는 끝에 공백을 무시하려면 : trim($input) > ''.
ToolmakerSteve

... 또한 때 발생하는 테스트 할 필요가 $input있다 '0'. 첫 번째 인수가 숫자 문자열 일 때 PHP가 a numeric또는 lexical비교를 수행하는지 여부는 명확하지 않습니다 .
ToolmakerSteve

-3

답을 얻었지만 귀하의 경우에는 사용할 수 있습니다

return empty($input);

또는

return is_string($input);

5
이것은 실패했습니다empty("0")
activategeek

2
@geekido-잘못된 답변을 다운 투표하는 것은 StackOverflow의 일부입니다-답변을 아래로 이동시키고 응답자가 답변을 수정하거나 제거하도록 권장합니다. 당신은 당신의 대답에 무엇이 잘못되었는지 이해합니까? 1.- empty이 답변은 이미 제공되었으므로 다시 언급해도 아무런 영향이 없습니다. 더 나쁜 점은 의견에서 논의한 바와 같이 잘못된 0것입니다. 이에 상응하는 모든 값 은 "빈"것으로 간주됩니다. 2. is_string다른 방법으로 잘못되었습니다-빈 문자열 ''은 문자열이므로 해당 경우 true를 반환합니다-질문이하는 일을 수행하지 못합니다.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.