Warum gibt eine Funktion, die prüft, ob eine Zeichenfolge leer ist, immer true zurück? [geschlossen]

231

Ich habe eine Funktion isNotEmpty, die true zurückgibt, wenn die Zeichenfolge nicht leer ist, und false, wenn die Zeichenfolge leer ist. Ich habe herausgefunden, dass es nicht funktioniert, wenn ich eine leere Zeichenfolge durchlaufe.

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

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

    return false;
}

Die Validierung der Zeichenfolge mit isNotEmpty erfolgt:

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

Wenn die Zeichenfolge leer ist, wird das andere nicht ausgeführt. Ich verstehe nicht, warum. Kann jemand bitte etwas Licht ins Dunkel bringen?

bgosalci
quelle
55
Nur ein Vorschlag: Es ist im Allgemeinen eine schlechte Praxis, Funktionen mit negierten Namen zu verwenden. Die Funktion isEmpty ($ input) ist besser lesbar, andernfalls könnte man sie folgendermaßen aufrufen: if (! IsNotEmpty ($ x)) ... isNotEmpty () und (! IsEmpty ()) hingegen nicht das anders. YMMV.
Johndodo
1
Um die gleiche Funktion ohne negierten Namen zu haben, vielleicht so etwas wie hasContent ().
OsakaWebbie
! thatDifferent @johndodo
coderatchet
Dies ist definitiv ein Off-Topic: Tippfehler Frage.
Mickmackusa

Antworten:

320

Einfaches Problem eigentlich. Veränderung:

if (strTemp != '')

zu

if ($strTemp != '')

Möglicherweise möchten Sie es auch ändern in:

if ($strTemp !== '')

Da != ''wird true zurückgegeben, wenn Sie die numerische 0 und einige andere Fälle aufgrund der automatischen Typkonvertierung von PHP übergeben .

Sie sollten hierfür nicht die integrierte Funktion empty () verwenden. Siehe Kommentare und die PHP-Typvergleichstabellen .

Cletus
quelle
4
Ändern Sie das if möglicherweise in: return $ strTemp! == '';
Strager
12
Sie möchten nicht leer () verwenden. Betrachten Sie eine Folge von Leerzeichen: $ x = ""; var_dump (! leer ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSE) * /
nickf
5
Das OP schneidet die Zeichenfolge. In diesem Fall ist es angemessen.
Cletus
8
@cletus: dann betrachte einen String $ s = '0'. Wenn Sie leer ($ s) aufrufen, wird dies als wahr ausgewertet (nicht intuitiv imho, aber es ist so).
Johndodo
28
Verwenden Sie nicht leer ()! empty () gibt true für Werte wie '0' zurück. Siehe php.net/manual/en/types.comparisons.php
Scott Tesler
27

PHP hat eine eingebaute Funktion namens empty() Der Test wird durch Eingabe von if(empty($string)){...} Referenz php.net: php leer durchgeführt

Malak
quelle
4
Die leere Referenz befindet sich bereits am Ende der akzeptierten Antwort von cletus. Sehen Sie auch, dass dieser Frage- und Antwort-Thread von April 2009 stammt. Trotzdem vielen Dank für Ihre Eingabe. Ich gebe Ihnen eine +1 für eine erste Antwort.
Regilero
64
Verwenden Sie nicht leer ()! empty () gibt true für Werte wie '0' zurück. Siehe php.net/manual/en/types.comparisons.php
Scott Tesler
3
@ScottDavidTesler Wenn der String "0" ist, gibt er dann true zurück? Oder nur wenn es die ganze Zahl 0 ist?
Tomas Zubiri
5
@TomasZubiri Ja, eine Zeichenfolge mit "0" gibt true zurück.
Michael Sund
3
BITTE, niemand anderes hat diese falsche Antwort positiv bewertet - lesen Sie die obigen Kommentare!
ToolmakerSteve
24

Ich verwende immer einen regulären Ausdruck, um nach einer leeren Zeichenfolge zu suchen, die auf CGI / Perl-Tage zurückgeht, und auch mit Javascript. Warum also nicht auch mit PHP, z. B. (wenn auch nicht getestet)?

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

Wobei \ S ein beliebiges Nicht-Leerzeichen darstellt

Sauerstoff
quelle
1
Dies ist die einzige Lösung, bei der nicht davon ausgegangen wird, dass Null mit einer leeren Zeichenfolge identisch ist!
Matthew Lock
1
Kühle Lösung. Als Randnotiz erwähnt stackoverflow.com/a/4544642/5411817 : Standardmäßig .stimmen keine neuen Zeilen überein - [\s\S]ist ein Hack um dieses Problem. Dies ist in JavaScript üblich, aber in PHP können Sie das /sFlag verwenden, um den Punkt mit allen Zeichen abzugleichen. Und stackoverflow.com/a/4544646/5411817 erwähnt: Schaltet (?s)den sModus ein und aus, (?-s)wenn er ausgeschaltet ist. Nach dem Ausschalten .stimmt eine der folgenden Zeilen nicht mit einer neuen Zeile überein. Wenn Sie den Schalter inline (eingebettet in den regulären Ausdruck) ein- und ausschalten möchten, anstatt als regulärer Ausdruck.
SherylHohman
19

In Ihrer ifKlausel in der Funktion verweisen Sie auf eine Variable strTemp, die nicht vorhanden ist. $strTempexistiert jedoch.

Aber PHP hat schon eine empty() Funktion zur Verfügung; warum deine eigenen machen?

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

Von php.net:

Rückgabewerte

Gibt FALSE zurück, wenn var einen nicht leeren Wert und einen Wert ungleich Null hat.

Die folgenden Dinge gelten als leer:

* "" (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

Björn
quelle
11
Nicht alle Implementierungen möchten, dass "0" als leer ausgewertet wird. Und wenn er das wollte, konnte er dann nicht genauso gut den if ($ x) -Vergleich verwenden, dh If (! Trim ($ str))?
Calvin
1
Beachten Sie, dass $ tmpStr! = '' Auch true zurückgibt, wenn $ tmpStr 0 oder false oder einen anderen leeren / falschen Wert enthält.
Pim Jager
5
Ihre Version funktioniert nicht wirklich: leer funktioniert für Variablen, nicht für Ausdrücke.
Hound
13

PHP wertet eine leere Zeichenfolge mit false aus, sodass Sie einfach Folgendes verwenden können:

if (trim($userinput['phoneNumber'])) {
  // validate the phone number
} else {
  echo "Phone number not entered<br/>";
}
troelskn
quelle
9
Dies funktioniert gut, bis Sie 0 passieren. Ansonsten ist die Idee großartig, ich werde es uns an einigen anderen Stellen geben. Vielen Dank für Ihre Antwort.
Bgosalci
10

Verwenden Sie einfach die Funktion strlen ()

if (strlen($s)) {
   // not empty
}
Doctorlai
quelle
1
es hängt davon ab, wie PHP die Funktion strlen () implementiert. In Delphi hat die Zeichenfolge beispielsweise tatsächlich ihre Länge minus 4 Byte Offset gespeichert, sodass die Überprüfung ihrer Länge trivial ist.
Doctorlai
5
Geben Sie nicht save ein. Bevor Php 5.3die Funktion zurückkehrt, 5wenn $svom Typ ist array. Php > 5.3wird eine Ausnahme erheben. Ich empfehle die Verwendung is_string($s) && str_len($s) > 0. >0nur zum Lesen.
magic_al
5

Ich schreibe einfach meine eigene Funktion, is_string zur Typprüfung und strlen zur Überprüfung der Länge.

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

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

Hier ist ein kleiner Test repl.it

BEARBEITEN: Sie können auch die Trimmfunktion verwenden, um zu testen, ob die Zeichenfolge ebenfalls leer ist.

is_string($str) && strlen(trim($str)) === 0;    
svarog
quelle
1

Ich musste in PHP auf ein leeres Feld testen und benutzte

ctype_space($tempVariable)

das hat gut für mich funktioniert.

TRayman
quelle
Dies ist eine korrekte Antwort auf eine andere Frage. Diese Antwort prüft NICHT, ob eine Zeichenfolge leer ist.
Mickmackusa
0

Nun, hier ist die kurze Methode, um zu überprüfen, ob die Zeichenfolge leer ist oder nicht.

$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
}
Abhishek Bagul
quelle
Die Überprüfung strlen()wurde 2014 auf dieser Seite empfohlen. Ihre Antwort bringt keinen neuen Wert.
Mickmackusa
0

Sie können einfach zu bool werfen, vergessen Sie nicht, mit Null umzugehen.

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)
Fabian Picone
quelle
(bool)$strist das gleiche wie zu tun !empty($str)und hat das gleiche Problem mit '0'. Lesen Sie PHP Booleans , den Abschnitt "Konvertieren in Boolean". Auch hast du es rückwärts - sollte sein !(bool)$string'. Oder Ihre Funktion sollte "isNotEmpty" heißen. Unabhängig davon stecken Sie mit der falschen Behandlung von '0' fest.
ToolmakerSteve
@ToolmakerSteve Für das 0Problem behandeln Sie dies einfach, bevor Sie den gegossenen String zurückgeben. Und vielen Dank, ich habe die Negation vergessen !(negierte Funktionsnamen sind schlechte Praxis). Meinen Beitrag bearbeitet.
Fabian Picone
-1

Ich weiß, dass dieser Thread ziemlich alt war, aber ich wollte nur eine meiner Funktionen teilen. Diese Funktion unten kann nach leeren Zeichenfolgen, Zeichenfolgen mit maximaler Länge, minimaler Länge oder genauer Länge suchen. Wenn Sie nach leeren Zeichenfolgen suchen möchten, geben Sie einfach $ min_len und $ max_len als 0 ein.

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;
}
Kevin Ng
quelle
-2

Vielleicht kannst du das versuchen

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

das liegt an der php konfiguration in php.ini

0xFF
quelle
-2

Wenn Sie ein Feld haben, nämlich serial_number, und dann leer prüfen möchten

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

Auf diese Weise können Sie alle Dateien in der Schleife mit einer anderen leeren Funktion überprüfen

user2042007
quelle
empty()wurde bereits 2009 auf dieser Seite empfohlen.
mickmackusa
-2

Dies ist die kurze und effektive Lösung, genau das, wonach Sie suchen:

return $input > null ? 'not empty' : 'empty' ;
Moti Winkler
quelle
Ich habe nicht getestet, ob dies funktioniert, aber wenn dies der Fall ist, wird es nullzum Vergleich in eine leere Zeichenfolge konvertiert . In diesem Fall wäre es viel klarer zu sagen, was Sie meinen : $input > ''. Das heißt, "Führen Sie einen lexikalischen Vergleich zwischen der Eingabezeichenfolge und einer leeren Zeichenfolge durch". Oder um Leerzeichen an den Enden zu ignorieren : trim($input) > ''.
ToolmakerSteve
... Auch testen müssen , was passiert , wenn $inputist '0'. Nicht klar, ob PHP einen numericoder einen lexicalVergleich durchführt, wenn das erste Argument eine numerische Zeichenfolge ist.
ToolmakerSteve
-3

Sie haben eine Antwort erhalten, aber in Ihrem Fall können Sie verwenden

return empty($input);

oder

return is_string($input);
Geekido
quelle
5
dies nicht gelingt fürempty("0")
activatedgeek
2
@geekido - das Herunterstimmen falscher Antworten ist Teil von StackOverflow - es verschiebt diese Antworten nach unten und ermutigt die Antwortenden, ihre Antwort zu korrigieren oder zu entfernen. Verstehst du, was mit deiner Antwort falsch ist? 1. empty- Diese Antwort wurde bereits gegeben, daher trägt es nichts dazu bei, sie noch einmal zu sagen. Schlimmer noch, wie in den Kommentaren besprochen wurde, ist es falsch - jeder Wert, der äquivalent zu ist, 0wird als "leer" betrachtet. 2. is_stringist auf andere Weise falsch - eine leere Zeichenfolge ''ist eine Zeichenfolge, gibt also in diesem Fall true zurück - kann die gestellten Fragen nicht erfüllen.
ToolmakerSteve