Perché una funzione che controlla se una stringa è vuota restituisce sempre true? [chiuso]


231

Ho una funzione isNotEmpty che restituisce true se la stringa non è vuota e false se la stringa è vuota. Ho scoperto che non funziona se passo attraverso una stringa vuota.

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

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

    return false;
}

La convalida della stringa utilizzando isNotEmpty viene eseguita:

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

Se la stringa è vuota, l'altro non viene eseguito, non capisco perché, qualcuno può far luce su questo, per favore.


55
Solo un suggerimento: è generalmente una cattiva pratica usare funzioni con nomi negati. È più leggibile avere la funzione isEmpty ($ input), altrimenti potresti chiamarla così: if (! IsNotEmpty ($ x)) ... D'altra parte, isNotEmpty () e (! IsEmpty ()) non è così diverso. YMMV.
johndodo,

1
Per avere la stessa funzione senza un nome negato, forse qualcosa come hasContent ().
Osaka Webbie,

! thatDifferent @johndodo
coderatchet

Questa è Sicuramente una domanda fuori tema: errore di battitura .
Mickmackusa,

Risposte:


320

In realtà semplice problema. Modificare:

if (strTemp != '')

per

if ($strTemp != '')

Probabilmente potresti anche volerlo cambiare in:

if ($strTemp !== '')

poiché != ''restituirà vero se si passa è 0 numerico e alcuni altri casi a causa della conversione automatica del tipo di PHP .

Per questo non dovresti usare la funzione built-in empty () ; vedere i commenti e le tabelle di confronto dei tipi di PHP .


4
Probabilmente, cambia l'if in: return $ strTemp! == '';
Strager

12
non vuoi usare empty (). Considera una stringa di spazi: $ x = ""; var_dump (empty ($ x)!); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf

5
L'OP sta tagliando la stringa. In questo caso è appropriato.
cletus,

8
@cletus: considera quindi una stringa $ s = '0'. Se chiami vuoto ($ s) verrà valutato come vero (non intuitivo, ma è così).
johndodo,

28
Non usare empty ()! empty () restituirà true per valori come '0'. Vedi php.net/manual/en/types.comparisons.php
Scott Tesler il

27

PHP ha una funzione integrata chiamata empty() il test viene eseguito digitando if(empty($string)){...} Riferimento php.net: php vuoto


4
il riferimento vuoto è già alla fine della risposta accettata da cletus. Vedi anche che questo thread di domande e risposte è di aprile 2009. Comunque grazie per il tuo contributo. Ti sto dando un +1 per una prima risposta.
regilero,

64
Non usare empty ()! empty () restituirà true per valori come '0'. Vedi php.net/manual/en/types.comparisons.php
Scott Tesler il

3
@ScottDavidTesler Se la stringa è "0" restituirà true? O solo se è l'intero 0?
Tomas Zubiri,

5
@TomasZubiri Sì, una stringa contenente "0" restituirà true.
Michael Sund

3
PER FAVORE, nessun altro ha votato a favore di questa risposta ERRATA - leggi i commenti sopra!
ToolmakerSteve

24

Uso sempre un'espressione regolare per cercare una stringa vuota, risalente ai giorni CGI / Perl, e anche con Javascript, quindi perché non anche con PHP, ad es. (Anche se non testato)

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

Dove \ S rappresenta qualsiasi carattere non bianco


1
Questa è l'unica soluzione qui che non presuppone che zero sia uguale a una stringa vuota!
Matthew Lock,

1
Soluzione interessante. Come nota a margine , stackoverflow.com/a/4544642/5411817 menziona: per impostazione predefinita .non corrisponde a nuove righe - [\s\S]è un trucco per quel problema. Questo è comune in JavaScript, ma in PHP puoi usare il /sflag per far corrispondere il punto a tutti i caratteri. E stackoverflow.com/a/4544646/5411817 menziona: (?s)attiva la smodalità e (?-s)disattiva. Una volta disattivato qualsiasi seguito .non corrisponderà a una nuova riga. se si desidera attivare / disattivare l'interruttore in linea (incorporato all'interno di regex) anziché come flag regex.
SherylHohman,

19

Nella tua ifclausola nella funzione, ti riferisci a una variabile strTempche non esiste. $strTempesiste, però.

Ma PHP ha già una empty()funzione disponibile; perché crearne uno tuo?

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

Da php.net:

Valori di restituzione

Restituisce FALSE se var ha un valore non vuoto e diverso da zero.

Le seguenti cose sono considerate vuote:

* "" (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
Non tutte le implementazioni vorrebbero che "0" venisse valutato come vuoto. E se lo volesse, non potrebbe anche usare il confronto if ($ x), cioè If (! Trim ($ str))?
Calvin,

1
Nota che fare $ tmpStr! = '' Restituirà anche true di $ tmpStr che contiene 0 o false o un altro valore vuoto / falso.
Pim Jager,

5
La tua versione in realtà non funziona: vuoti funziona su variabili, non su espressioni.
Hound

13

PHP valuta una stringa vuota su false, quindi puoi semplicemente usare:

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

9
Funziona benissimo fino a quando non passi 0. Altrimenti l'idea è fantastica, la utilizzerò in altri posti. Grazie per la risposta.
bgosalci,

10

Usa solo la funzione strlen ()

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

1
dipende da come PHP implementa la funzione strlen (). Ad esempio, in Delphi, la stringa ha effettivamente memorizzato la sua lunghezza meno l'offset di 4 byte, quindi controllare la sua lunghezza è banale.
doctorlai,

5
Non digitare save. Prima che Php 5.3la funzione ritorni 5se $sè di tipo array. Php > 5.3sorgerà un'eccezione. Raccomando di usare is_string($s) && str_len($s) > 0. >0solo a scopo di lettura.
magic_al

5

Scrivo solo la mia funzione, is_string per il controllo del tipo e strlen per controllare la lunghezza.

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

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

Ecco un piccolo test repl.it

EDIT: puoi anche usare la funzione trim per verificare se anche la stringa è vuota.

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

1

Avevo bisogno di testare un campo vuoto in PHP e usato

ctype_space($tempVariable)

che ha funzionato bene per me.


Questa è una risposta corretta a una domanda diversa. Questa risposta NON controlla se una stringa è vuota.
mickmackusa,

0

Bene, ecco il metodo breve per verificare se la stringa è vuota o meno.

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

Il controllo è strlen()stato raccomandato nel 2014 su questa pagina. La tua risposta non aggiunge alcun nuovo valore.
mickmackusa,

0

Puoi semplicemente lanciare per bool, non dimenticare di gestire 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è lo stesso di fare !empty($str)e ha lo stesso problema con '0'. Leggi PHP booleani, la sezione "Conversione in booleano". Inoltre, hai ottenuto al contrario - dovrebbe essere !(bool)$string'. O la tua funzione dovrebbe essere chiamata "isNotEmpty". Indipendentemente da ciò, sei bloccato con una gestione errata di '0'.
ToolmakerSteve

@ToolmakerSteve Per il 0problema basta gestirlo prima di restituire la stringa di cast. E grazie mille, ho dimenticato la negazione !(i nomi delle funzioni negate sono cattive pratiche). Ho modificato il mio post.
Fabian Picone,

-1

So che questo thread era piuttosto vecchio ma volevo solo condividere una delle mie funzioni. Questa funzione di seguito può controllare stringhe vuote, stringhe con lunghezze massime, lunghezze minime o lunghezza esatta. Se vuoi verificare la presenza di stringhe vuote, inserisci $ min_len e $ max_len come 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

forse puoi provare questo

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

questo è dovuto alla configurazione di php in php.ini


-2

se hai un campo vale a dire serial_number e vuoi controllare vuoto allora

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

in questo modo puoi controllare tutti i file nel loop con un'altra funzione vuota


empty()era già stato raccomandato in questa pagina nel 2009.
mickmackusa,

-2

questa è la soluzione breve ed efficace, esattamente quello che stai cercando:

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

Non ho testato se questo funziona, ma se lo fa, sarebbe convertendolo nullin stringa vuota per il confronto. In tal caso, sarebbe molto più chiaro per dire quello che vuoi dire: $input > ''. Cioè, "esegui un confronto lessicale tra la stringa di input e una stringa vuota". O di ignorare gli spazi alle estremità: trim($input) > ''.
ToolmakerSteve

... Anche bisogno di testare cosa succede quando $inputè '0'. Non è chiaro se php fa un confronto numerico lexical, quando il primo argomento è una stringa numerica.
ToolmakerSteve

-3

Hai una risposta ma nel tuo caso puoi usare

return empty($input);

o

return is_string($input);

5
questo non riesce perempty("0")
activatedgeek

2
@geekido - il downvoting delle risposte errate fa parte di StackOverflow - sposta quelle risposte in basso e incoraggia i rispondenti a correggere la loro risposta o rimuoverla. Capisci cosa c'è che non va nella tua risposta? 1. empty- questa risposta è già stata data, quindi ripeterla non contribuisce a nulla. Peggio ancora, come è stato discusso nei commenti, è sbagliato - qualsiasi valore equivalente 0sarà considerato "vuoto". 2. is_stringè sbagliato in un modo diverso - una stringa vuota ''è una stringa, quindi restituirà true in quel caso - non riesce a fare la domanda posta.
ToolmakerSteve
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.