¿Por qué una función que verifica si una cadena está vacía siempre devuelve verdadero? [cerrado]


231

Tengo una función isNotEmpty que devuelve verdadero si la cadena no está vacía y falsa si la cadena está vacía. Descubrí que no funciona si paso una cadena vacía a través de él.

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

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

    return false;
}

La validación de la cadena usando isNotEmpty se realiza:

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

Si la cadena está vacía, el resto no se ejecuta, no entiendo por qué, ¿alguien puede arrojar algo de luz sobre esto, por favor?


55
Solo una sugerencia: generalmente es una mala práctica usar funciones con nombres negados. Es más legible tener la función isEmpty ($ input), de lo contrario podría llamarlo así: if (! IsNotEmpty ($ x)) ... Por otro lado, isNotEmpty () y (! IsEmpty ()) no es que diferente YMMV.
johndodo

1
Para tener la misma función sin un nombre negado, tal vez algo como hasContent ().
OsakaWebbie

! thatDifferent @johndodo
coderatchet

Esta es DEFINITIVAMENTE una pregunta fuera de tema: error tipográfico .
mickmackusa

Respuestas:


320

Problema simple en realidad. Cambio:

if (strTemp != '')

a

if ($strTemp != '')

Posiblemente también quieras cambiarlo a:

if ($strTemp !== '')

dado != ''que volverá verdadero si pasa es numérico 0 y algunos otros casos debido a la conversión automática de tipo de PHP .

No debe usar la función vacía () incorporada para esto; ver comentarios y las tablas de comparación de tipos PHP .


44
Posiblemente, cambie el if a: return $ strTemp! == '';
extraño

12
no quieres usar empty (). Considere una cadena de espacios: $ x = ""; var_dump (! empty ($ x)); / * (TRUE) / var_dump (isNotEmpty ($ x)); / (FALSO) * /
nickf

55
El OP está recortando la cadena. En este caso es apropiado.
cletus

8
@cletus: luego considere una cadena $ s = '0'. Si llama vacío ($ s), se evaluará como verdadero (no es intuitivo, pero es así).
johndodo

28
¡No uses vacío ()! empty () devolverá verdadero para valores como '0'. Ver php.net/manual/en/types.comparisons.php
Scott Tesler

27

PHP tiene una función incorporada llamada empty() la prueba se realiza escribiendo if(empty($string)){...} Referencia php.net: php vacío


44
la referencia vacía ya está al final de la respuesta aceptada de cletus. Vea también que este hilo de preguntas y respuestas es de abril de 2009. De todos modos, gracias por su aporte. Te doy un +1 por la primera respuesta.
regilero

64
¡No uses vacío ()! empty () devolverá verdadero para valores como '0'. Ver php.net/manual/en/types.comparisons.php
Scott Tesler el

3
@ScottDavidTesler Si la cadena es "0", ¿devolverá verdadero? ¿O solo si es el entero 0?
Tomas Zubiri

55
@TomasZubiri Sí, una cadena que contiene "0" devolverá verdadero.
Michael Sund

3
POR FAVOR, nadie más votó esta respuesta INCORRECTA - ¡lea los comentarios anteriores!
ToolmakerSteve

24

Siempre uso una expresión regular para buscar una cadena vacía, que se remonta a los días CGI / Perl, y también con Javascript, entonces, ¿por qué no también con PHP, por ejemplo (aunque no probado)

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

Donde \ S representa cualquier carácter que no sea un espacio en blanco


1
¡Esta es la única solución aquí que no asume que cero es lo mismo que una cadena vacía!
Matthew Lock

1
Solución genial Como nota al margen, stackoverflow.com/a/4544642/5411817 menciona: Por defecto ., no coincide con las nuevas líneas, [\s\S]es un truco para solucionar ese problema. Esto es común en JavaScript, pero en PHP puede usar la /sbandera para hacer que el punto coincida con todos los caracteres. Y stackoverflow.com/a/4544646/5411817 menciona: (?s)activa el smodo y (?-s)desactiva si está desactivado. Una vez desactivado, cualquier seguimiento .no coincidirá con una nueva línea. si desea activar / desactivar el interruptor en línea (incrustado dentro de la expresión regular) en lugar de como una bandera de expresión regular.
SherylHohman

19

En su ifcláusula en la función, se refiere a una variable strTempque no existe. $strTempexiste, sin embargo.

Pero PHP ya tiene una empty()función disponible; ¿Por qué hacer el tuyo?

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

Desde php.net:

Valores de retorno

Devuelve FALSE si var tiene un valor no vacío y no cero.

Las siguientes cosas se consideran vacías:

* "" (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
No todas las implementaciones querrían que "0" se evalúe como vacío. Y si él quisiera eso, ¿no podría usar la comparación if ($ x), es decir If (! Trim ($ str))?
Calvin el

1
Tenga en cuenta que hacer $ tmpStr! = '' También devolverá verdadero de $ tmpStr contiene 0 o falso u otro valor vacío / falso.
Pim Jager

55
Su versión no funcionará realmente: el vacío funciona en variables, no en expresiones.
Sabueso

13

PHP evalúa una cadena vacía como falsa, por lo que simplemente puede usar:

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

99
Esto funciona bien hasta que pase 0. De lo contrario, la idea es genial, la usaré en otros lugares. Gracias por su respuesta.
bgosalci 05 de

10

Solo usa la función strlen ()

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

1
depende de cómo PHP implemente la función strlen (). Por ejemplo, en Delphi, la cadena en realidad ha almacenado su longitud menos 4 bytes de desplazamiento, por lo que verificar su longitud es trivial.
doctorlai

55
No escriba guardar. Antes de que Php 5.3la función regrese 5si $ses de tipo array. Php > 5.3surgirá una excepción. Recomiendo usar is_string($s) && str_len($s) > 0. >0solo para fines de lectura.
magic_al

5

Solo escribo mi propia función, is_string para la verificación de tipos y strlen para verificar la longitud.

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

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

Aquí hay una pequeña prueba repl.it

EDITAR: También puede usar la función de recorte para probar si la cadena también está en blanco.

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

1

Necesitaba probar un campo vacío en PHP y usé

ctype_space($tempVariable)

que funcionó bien para mí


Esta es una respuesta correcta a una pregunta diferente. Esta respuesta NO comprueba si una cadena está vacía.
mickmackusa

0

Bueno, aquí está el método corto para verificar si la cadena está vacía o no.

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

Verificación strlen()fue recomendado en 2014 en esta página. Su respuesta no agrega ningún valor nuevo.
mickmackusa

0

Simplemente puede lanzar a bool, no olvide manejar cero.

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)$stres lo mismo que hacer !empty($str), y tiene el mismo problema con '0'. Lea PHP Booleans , la sección "Convertir a booleano". Además, lo tienes al revés, debería ser !(bool)$string'. O su función debería llamarse "isNotEmpty". En cualquier caso, está atrapado con un manejo incorrecto de '0'.
ToolmakerSteve

@ToolmakerSteve Para el 0problema, simplemente maneje eso antes de devolver la cadena fundida. Y muchas gracias, olvidé la negación !(los nombres de funciones negadas son una mala práctica). Edité mi publicación.
Fabian Picone

-1

Sé que este hilo es bastante antiguo, pero solo quería compartir una de mis funciones. Esta función a continuación puede verificar cadenas vacías, cadenas con longitudes máximas, longitudes mínimas o longitud exacta. Si desea buscar cadenas vacías, simplemente ponga $ min_len y $ 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

tal vez puedas probar esto

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

eso se debe a la configuración de php en php.ini


-2

si tiene un campo llamado serial_number y desea marcar vacío, entonces

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

de esta manera, puede revisar todos los archivos en el bucle con otra función vacía


empty()ya estaba recomendado en esta página en 2009.
mickmackusa

-2

Esta es la solución corta y efectiva, exactamente lo que estás buscando:

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

No he probado si esto funciona, pero si lo hace, sería mediante la conversión nulla una cadena vacía para la comparación. En cuyo caso, sería mucho más claro decir lo que quiere decir: $input > ''. Es decir, "realice una comparación léxica entre la cadena de entrada y una cadena vacía". O hacer caso omiso de los espacios en blanco en los extremos: trim($input) > ''.
ToolmakerSteve

... También es necesario probar lo que sucede cuando $inputes '0'. No está claro si php hace una numerico lexicalcomparación, cuando el primer argumento es una cadena numérica.
ToolmakerSteve

-3

Tienes una respuesta pero en tu caso puedes usar

return empty($input);

o

return is_string($input);

55
esto no funciona paraempty("0")
activatedgeek

2
@geekido: rechazar las respuestas incorrectas forma parte de StackOverflow: mueve esas respuestas hacia abajo y alienta a los que responden a corregirlas o eliminarlas. ¿Entiendes lo que está mal con tu respuesta? 1. empty- esta respuesta ya se ha dado, por lo que decirla nuevamente no aporta nada. Peor aún, como se ha discutido en los comentarios, está mal: cualquier valor equivalente a 0se considerará "vacío". 2. is_stringestá equivocado de una manera diferente: una cadena vacía ''es una cadena, por lo que devolverá verdadero en ese caso, no puede hacer lo que hace la pregunta.
ToolmakerSteve
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.