Por que uma função que verifica se uma string está vazia sempre retorna true? [fechadas]


231

Eu tenho uma função isNotEmpty que retorna true se a string não estiver vazia e false se a string estiver vazia. Eu descobri que não está funcionando se eu passar uma string vazia por ele.

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

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

    return false;
}

A validação da string usando isNotEmpty é feita:

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

Se a string estiver vazia, o resto não será executado, não entendo o motivo, alguém pode esclarecer isso, por favor.


55
Apenas uma sugestão: geralmente é uma prática ruim usar funções com nomes negados. É mais legível ter a função isEmpty ($ input), caso contrário, você pode chamar assim: if (! IsNotEmpty ($ x)) ... Por outro lado, isNotEmpty () e (! IsEmpty ()) não é tão diferente. YMMV.
Johndodo 27/10

1
Para ter a mesma função sem um nome negado, talvez algo como hasContent ().
OsakaWebbie

! thatDifferent @johndodo
coderatchet

DEFINITIVAMENTE, é uma pergunta fora de tópico: erro de digitação .
mickmackusa

Respostas:


320

Problema simples, na verdade. Mudança:

if (strTemp != '')

para

if ($strTemp != '')

É possível que você também queira alterá-lo para:

if ($strTemp !== '')

desde != ''que retornará true se você passar é numérico 0 e alguns outros casos devido à conversão automática de tipo do PHP .

Você não deve usar a função built-in empty () para isso; veja os comentários e as tabelas de comparação de tipos PHP .


4
Indiscutivelmente, altere o if para: return $ strTemp! == '';
Strager

12
você não quer usar vazio (). Considere uma sequência de espaços: $ x = ""; var_dump (! vazio ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
O OP está aparando a corda. Nesse caso, é apropriado.
Cletus

8
@cletus: considere uma string $ s = '0'. Se você chamar vazio ($ s), ele será avaliado como verdadeiro (imho não intuitivo, mas é verdade).
Johndodo 27/10

28
Não use vazio ()! empty () retornará true para valores como '0'. Veja php.net/manual/en/types.comparisons.php
Scott Tesler,

27

O PHP possui uma função integrada chamada empty() teste, digitando if(empty($string)){...} Referência php.net: php empty


4
a referência vazia já está no final da resposta aceita do cletus. Veja também que este tópico de perguntas e respostas é de abril de 2009. De qualquer forma, obrigado pela sua contribuição. Estou dando um +1 para a primeira resposta.
regilero

64
Não use vazio ()! empty () retornará true para valores como '0'. Veja php.net/manual/en/types.comparisons.php
Scott Tesler,

3
@ScottDavidTesler Se a string for "0", ela retornará true? Ou apenas se for o número inteiro 0?
Tomas Zubiri 03/10

5
@TomasZubiri Sim, uma string contendo "0" retornará true.
Michael Sund

3
POR FAVOR, ninguém mais votou esta resposta ERRADA - leia os comentários acima!
Home

24

Eu sempre uso uma expressão regular para verificar se há uma string vazia, que remonta aos dias CGI / Perl e também com Javascript, então por que não também com PHP, por exemplo (embora não testado)

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

Onde \ S representa qualquer caractere que não seja um espaço em branco


1
Esta é a única solução aqui que não assume que zero é igual a uma string vazia!
Matthew Lock

1
Solução legal. Como uma observação lateral, o stackoverflow.com/a/4544642/5411817 menciona: Por padrão ., não corresponde a novas linhas - [\s\S]é um truque para solucionar esse problema. Isso é comum em JavaScript, mas em PHP você pode usar a /sflag para fazer o ponto corresponder a todos os caracteres. E o stackoverflow.com/a/4544646/5411817 menciona: (?s)ativa o smodo e (?-s)desativa se estiver desativado. Uma vez desativado, qualquer seguinte .não corresponderá a uma nova linha. se você deseja ativar / desativar o comutador inline (incorporado dentro da regex) em vez de como um sinalizador de regex.
SherylHohman 11/04

19

Na sua ifcláusula na função, você está se referindo a uma variável strTempque não existe. $strTempexiste, no entanto.

Mas o PHP já tem uma empty()função disponível; por que fazer o seu?

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

Do php.net:

Retornar valores

Retorna FALSE se var tiver um valor não vazio e diferente de zero.

Os seguintes itens são considerados vazios:

* "" (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
Nem todas as implementações gostariam que "0" fosse avaliado como vazio. E se ele quisesse isso, ele não poderia usar a comparação if ($ x), ou seja, If (! Trim ($ str))?
Calvin

1
Observe que fazer $ tmpStr! = '' Também retornará true de $ tmpStr contém 0 ou false ou outro valor vazio / falso.
Pim Jager

5
Sua versão não funcionará: vazias funcionam em variáveis, não em expressões.
Hound

13

O PHP avalia uma string vazia como false, então você pode simplesmente usar:

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

9
Isso funciona bem até você atingir 0. Caso contrário, a idéia é ótima, eu a usarei em outros lugares. Obrigado pela sua resposta.
bgosalci

10

Basta usar a função strlen ()

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

1
depende de como o PHP implementa a função strlen (). Por exemplo, no Delphi, a string realmente armazenou seu comprimento menos deslocamento de 4 bytes, portanto, verificar seu comprimento é trivial.
doctorlai

5
Não digite salvar. Antes que Php 5.3a função retorne 5se $sfor do tipo array. Php > 5.3criará uma exceção. Eu recomendo usar is_string($s) && str_len($s) > 0. >0apenas para fins de leitura.
magic_al

5

Acabei de escrever minha própria função, is_string para verificação de tipo e strlen para verificar o comprimento.

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

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

Aqui está um pequeno teste repl.it

EDIT: Você também pode usar a função de apara para testar se a string também está em branco.

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

1

Eu precisava testar um campo vazio em PHP e usado

ctype_space($tempVariable)

o que funcionou bem para mim.


Esta é uma resposta correta para uma pergunta diferente. Esta resposta NÃO verifica se uma sequência está vazia.
mickmackusa 11/06

0

Bem, aqui está o método curto para verificar se a string está vazia ou não.

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

A verificação strlen()foi recomendada em 2014 nesta página. Sua resposta não agrega nenhum novo valor.
mickmackusa 11/06

0

Você pode simplesmente converter para bool, não se esqueça de lidar com 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)$stré o mesmo que fazer !empty($str)e tem o mesmo problema com '0'. Leia PHP Booleans , a seção "Convertendo em booleano". Além disso, você entendeu de trás para frente - deveria ser !(bool)$string'. Ou sua função deve ser nomeada "isNotEmpty". Independentemente, você está preso ao manuseio incorreto de '0'.
Home

@ToolmakerSteve Para o 0problema, lide com isso antes de retornar a string fundida. E muito obrigado, esqueci a negação !(nomes de funções negados são uma má prática). Editou minha postagem.
Fabian Picone

-1

Eu sei que esse segmento era muito antigo, mas eu só queria compartilhar uma das minhas funções. Esta função abaixo pode verificar cadeias vazias, cadeias com comprimentos máximos, comprimentos mínimos ou comprimento exato. Se você deseja procurar por strings vazias, basta colocar $ min_len e $ max_len como 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

talvez você possa tentar isso

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

isso é por causa da configuração do php no php.ini


-2

se você possui um campo chamado serial_number e deseja verificar vazio,

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

Dessa forma, você pode digitar todos os arquivos no loop com outra função vazia


empty()já foi recomendado nesta página em 2009.
mickmackusa 11/06

-2

Esta é a solução curta e eficaz, exatamente o que você está procurando:

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

Eu não testei se isso funciona, mas, se funcionar, seria convertendo nullpara string vazia para comparação. Nesse caso, seria muito mais clara para dizer o que quer dizer: $input > ''. Ou seja, "faça uma comparação lexical entre a sequência de entrada e uma sequência vazia". Ou ignorar espaços em branco nas extremidades: trim($input) > ''.
Home

... Também precisa testar o que acontece quando $inputé '0'. Não está claro se o php faz uma numericou lexicalcomparação, quando o primeiro argumento é uma string numérica.
Página

-3

Você tem uma resposta, mas no seu caso você pode usar

return empty($input);

ou

return is_string($input);

5
isto falhar paraempty("0")
activatedgeek

2
@geekido - reduzir as respostas erradas faz parte do StackOverflow - move essas respostas para baixo e incentiva os respondentes a corrigi-las ou removê-las. Você entende o que está errado com sua resposta? 1. empty- esta resposta já foi dada, portanto, dizê-la novamente não contribui com nada. Pior, como foi discutido nos comentários, está errado - qualquer valor equivalente a 0será considerado "vazio". 2. is_stringestá errado de uma maneira diferente - uma string vazia ''é uma string, portanto retornará verdadeira nesse caso - falha ao fazer o que a pergunta faz.
Home
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.