Clases de Validación Estándar

Zend Framework viene con un conjunto estándar de clases de validación listas para usar.

Alnum

Devuelve TRUE si y sólo si $valor contiene caracteres alfanuméricos únicamente. Este validador incluye una opción para considerar también al espacio en blanco como caracter válido.

Nota

Los caracteres alfabéticos significan caracteres que componen palabras en cada idioma. Sin embargo, el alfabeto inglés es tratado como caracteres alfabéticos en los siguientes idiomas: chino, japonés, coreano. El lenguaje es especificado por Zend_Locale.

Alpha

Devuelve TRUE si y sólo si $valor sólo contiene caracteres alfabéticos. Este validador incluye una opción para considerar también al espacio en blanco como caracter válido.

Between

Devuelve TRUE si y sólo si $valor está entre los valores límites mínimo y máximo. La comparación es inclusiva por defecto ($valor puede ser igual a una valor límite), aunque esto puede ser anulado a fin de hacer una comparación estricta, donde $valor debe ser estrictamente mayor al mínimo y estrictamente menor al máximo.

Ccnum

Devuelve TRUE si y sólo si $valor sigue el algoritmo Luhn (mod-10 checksum) para tarjetas de crédito.

Nota

The Ccnum validator has been deprecated in favor of the CreditCard validator. For security reasons you should use CreditCard instead of Ccnum.

Date

Devuelve TRUE si y sólo si $valor es una fecha válida en el formato YYYY-MM-DD (AAAA-MM-DD). Si se usa la opción locale entonces la fecha será validada de acuerdo a lo establecido para ese locale. Además, si se establece la opción format ese formato se utiliza para la validación. Para más detalles acerca de los parámetros opcionales ver en: ZendDateDate::isDate().

Digits

Devuelve TRUE si y sólo si $valor contiene solamente dígitos.

Dirección de Email

Zend\Validate\EmailAddress Le permite validar una dirección de email. El validador primero divide la dirección de email en la parte local @ nombre de host e intenta igualar a estos contra especificaciones conocidas para direcciones y nombres de host para el correo electrónico.

Utilización básica

Un ejemplo básico de uso se ve a continuación:

1
2
3
4
5
6
7
8
9
$validator = new Zend\Validate\EmailAddress();
if ($validator->isValid($email)) {
    // El email parece ser válido
} else {
    // El email es inválido; muestre las razones
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Esto coincide con el correo electrónico $email y si fracasa, alimenta $validator->getMessages() con mensajes de error útiles.

>Partes locales complejas

Zend\Validate\EmailAddress supports several options which can either be set at initiation, by giving an array with the related options, or afterwards, by using setOptions(). The following options are supported:

  • allow: Defines which type of domain names are accepted. This option is used in conjunction with the hostname option to set the hostname validator. For more informations about possible values of this option, look at Hostname and possible ALLOW * constants. This option defaults to ALLOW_DNS.
  • hostname: Sets the hostname validator with which the domain part of the email address will be validated.
  • mx: Defines if the MX records from the server should be detected. If this option is defined to TRUE then the MX records are used to verify if the server accepts emails. This option defaults to FALSE.
  • deep: Defines if the servers MX records should be verified by a deep check. When this option is set to TRUE then additionally to MX records also the A, A6 and AAAA records are used to verify if the server accepts emails. This option defaults to FALSE.
  • domain: Defines if the domain part should be checked. When this option is set to FALSE, then only the local part of the email address will be checked. In this case the hostname validator will not be called. This option defaults to TRUE.
1
2
$validator = new Zend\Validate\EmailAddress();
$validator->setOptions(array('domain' => false));

Complex local parts

Zend\Validate\EmailAddress se comparará con cualquier dirección de correo válida de acuerdo a RFC2822. Por ejemplo, correos electrónicos válidos incluyen bob@domain.com, bob+jones@domain.us, “bob@jones”@domain.com y “bob jones”@domain.com

Algunos formatos obsoletos de email actualmente no validan (por ejemplo los retornos de carro o “\” un caracter en una dirección de correo electrónico).

Validating only the local part

If you need Zend\Validate\EmailAddress to check only the local part of an email address, and want to disable validation of the hostname, you can set the domain option to FALSE. This forces Zend\Validate\EmailAddress not to validate the hostname part of the email address.

1
2
$validator = new Zend\Validate\EmailAddress();
$validator->setOptions(array('domain' => FALSE));

Validating different types of hostnames

La parte nombre de host de una dirección de correo es validado contra ZendValidateHostname. Por defecto sólo son aceptados nombres de host DNS de la forma domain.com, aunque si lo desea también puede aceptar direcciones IP y nombres de host locales.

Para ello necesita instanciar a Zend\Validate\EmailAddress pasando un parámetro para indicar el tipo de nombres de host que quiere aceptar. Más detalles están incluidos en Zend\Validate\EmailAddress, aunque abajo hay un ejemplo de cómo aceptar tanto nombres de host DNS y locales:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$validator = new Zend\Validate\EmailAddress(
                    Zend\Validate\Hostname::ALLOW_DNS |
                    Zend\Validate\Hostname::ALLOW_LOCAL);
if ($validator->isValid($email)) {
    // email parece ser válido
} else {
    // email es inválido; muestre las razones
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Verificar si el nombre de host realmente acepta email

Sólo porque una dirección de correo electrónico está en el formato correcto, no necesariamente significa que esa dirección de correo electrónico existe realmente. Para ayudar a resolver este problema, puede usar la validación MX para comprobar si existe una entrada MX (email) en el registro DNS para correo electrónico en ese nombre de host. Esto le dice que el nombre de host acepta email, pero no le dice si la dirección de correo electrónico exacta es válida en si misma.

La comprobación MX no está activada por defecto y en este momento es soportada sólo por plataformas UNIX. Para habilitar el control MX puede pasar un segundo parámetro al constructor Zend\Validate\EmailAddress.

1
2
3
4
5
6
$validator = new Zend\Validate\EmailAddress(
    array(
        'allow' => Zend\Validate\Hostname::ALLOW_DNS,
        'mx'    => true
    )
);

Nota

MX Check under Windows

Within Windows environments MX checking is only available when PHP 5.3 or above is used. Below PHP 5.3 MX checking will not be used even if it’s activated within the options.

Alternativamente, para activar o desactivar la validación MX puede pasar TRUE o FALSE a $validator->setValidateMx().

Al habilitarlo, se usarán las funciones de red para comprobar la presencia de un registro MX en el nombre de host de la dirección de correo electrónico que desea validar. Tenga en cuenta esto probablemente hará más lento su script.

Sometimes validation for MX records returns false, even if emails are accepted. The reason behind this behaviour is, that servers can accept emails even if they do not provide a MX record. In this case they can provide A, A6 or AAAA records. To allow Zend\Validate\EmailAddress to check also for these other records, you need to set deep MX validation. This can be done at initiation by setting the deep option or by using setOptions().

1
2
3
4
5
6
7
$validator = new Zend\Validate\EmailAddress(
    array(
        'allow' => Zend\Validate\Hostname::ALLOW_DNS,
        'mx'    => true,
        'deep'  => true
    )
);

Advertencia

Performance warning

You should be aware that enabling MX check will slow down you script because of the used network functions. Enabling deep check will slow down your script even more as it searches the given server for 3 additional types.

Nota

Disallowed IP addresses

You should note that MX validation is only accepted for external servers. When deep MX validation is enabled, then local IP addresses like 192.168.* or 169.254.* are not accepted.

Validating International Domains Names

Zend\Validate\EmailAddress también comparará caracteres internationales que existen en algunos dominios. Esto se conoce como soporte de International Domain Name (IDN). Está activado por defecto, aunque puede deshabilitarlo internamente cambiando el ajuste a través del objeto Zend\Validate\Hostname que existe en Zend\Validate\EmailAddress.

1
$validator->getHostnameValidator()->setValidateIdn(false);

Sobre el uso de setValidateIdn() encontrará más información en la documentación de Zend\Validate\Hostname.

Tenga en cuenta que los IDNs se validarán solo si usted permite que nombres de host DNS sean validados.

Validación de dominios de nivel superior

Por defecto, un nombre de host se cotejará con una lista conocida de TLDs. Está activado por defecto, aunque puede deshabilitarlo cambiando el ajuste a través del objeto interno Zend\Validate\Hostname que existe en Zend\Validate\EmailAddress.

1
$validator->getHostnameValidator()->setValidateTld(false);

Encontrará más información sobre el uso de setValidateTld() en la documentación de Zend\Validate\Hostname.

Tenga en cuenta que los TLDs se validarán solo si usted permite que nombres de host DNS sean validados.

Setting messages

Zend\Validate\EmailAddress makes also use of Zend\Validate\Hostname to check the hostname part of a given email address. As with Zend Framework 1.10 you can simply set messages for Zend\Validate\Hostname from within Zend\Validate\EmailAddress.

1
2
3
4
5
6
$validator = new Zend\Validate\EmailAddress();
$validator->setMessages(
    array(
        Zend\Validate\Hostname::UNKNOWN_TLD => 'I don't know the TLD you gave'
    )
);

Before Zend Framework 1.10 you had to attach the messages to your own Zend\Validate\Hostname, and then set this validator within Zend\Validate\EmailAddress to get your own messages returned.

Float

Devuelve TRUE si y sólo si $value es un valor de punto flotante. Desde Zend Framework 1.8 toma en cuenta la localizacion actual del navegador, las variables o el uso. Puede usar get/setLocale para cambiar la configuracion regional o crear una instancia para este validador

GreaterThan

Devuelve TRUE si y sólo si $valor es mayor al límite mínimo.

Hex

Devuelve TRUE si y sólo si $valor contiene caracteres hexadecimales (0-9 y A-F).

Hostname (Nombre de Host)

Zend\Validate\Hostname le permite validar un nombre de host contra una serie de especificaciones conocidas. Es posible comprobar por tres diferentes tipos de nombres: el DNS Hostname (domain.com por ejemplo), dirección IP (es decir 1.2.3.4), y nombres de host locales (localhost, por ejemplo). Por defecto sólo se comprobarán nombres de host DNS.

Uso básico

El siguiente es un ejemplo de uso básico:

1
2
3
4
5
6
7
8
9
$validator = new Zend\Validate\Hostname();
if ($validator->isValid($hostname)) {
    // hostname parece ser válido
} else {
    // hostname es inválido; muestre las razones
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Comprobará el nombre de host $hostname y si fracasa alimentará a getMessages() con mensajes de error.

Validar diferentes tipos de nombres de host

También se puede encontrar coincidencias de direcciones IP, nombres de host locales, o una combinación de todos los tipos permitidos. Esto puede hacerse pasando un parámetro a Zend\Validate\Hostname cuando lo instancia. El parámetro debe ser un entero que determina qué tipos de nombres de host están permitidos. Se recomienda el uso de las constantes de Zend\Validate\Hostname para hacerlo.

Las constantes de Zend\Validate\Hostname son: ALLOW_DNS para permitir sólo nombres de host DNS, ALLOW_IP para permitir direcciones IP, ALLOW_LOCAL para permitir nombres de host de la red local, y ALLOW_ALL para permitir todos estos tres tipos. Para comprobar que direcciones IP puede utilizar, vea el siguiente ejemplo:

1
2
3
4
5
6
7
8
9
$validator = new Zend\Validate\Hostname(Zend\Validate\Hostname::ALLOW_IP);
if ($validator->isValid($hostname)) {
    // hostname parece ser válido
} else {
    // hostname es inválido; muestre las razones
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

Usando ALLOW_ALL para aceptar todos los tipos de nombres de host, también puede combinar estos tipos para realizar combinaciones. Por ejemplo, para aceptar nombres de host DNS y locales, instancie el objeto Zend\Validate\Hostname como:

1
2
$validator = new Zend\Validate\Hostname(Zend\Validate\Hostname::ALLOW_DNS |
                                        Zend\Validate\Hostname::ALLOW_IP);

Validación de Nombres de Dominio Internacionales

Algunos (ccTLD), es decir países “Country Code Top Level Domains” , como ‘de’ (Alemania), aceptan caracteres internacionales como nombres de dominio. Estos son conocidos como Nombres de Dominio Internacionales (IDN, por sus siglas en inglés). Se puede buscar una coincidencia de estos dominios con Zend\Validate\Hostname, a través de caracteres extendidos que se utilizan en el proceso de validación.

Until now more than 50 ccTLDs support IDN domains.

Cotejar dominios IDN es tan simple como usar el validador estándar Hostname, ya que este viene habilitado por defecto. Si desea desactivar la validación IDN, se puede hacer ya sea pasando un parámetro al constructor Zend\Validate\Hostname o a través del método setValidateIdn().

Puede deshabilitar la validación IDN, pasando un segundo parámetro al constructor ZendValidateHostname de la siguiente manera.

1
2
3
4
5
6
7
$validator =
    new Zend\Validate\Hostname(
        array(
            'allow' => Zend\Validate\Hostname::ALLOW_DNS,
            'idn'   => false
        )
    );

Alternativamente puede pasar TRUE o FALSE a setValidateIdn() para activar o desactivar la validación IDN. Si está tratando de cotejar un nombre de host IDN que actualmente no está soportado, es probable que falle la validación si tiene caracteres internacionales en el nombre de host. Cuando un archivo ccTLD no existe en Zend/Validate/Hostname, especificando los caracteres adicionales se puede realizar una validación normal.

Tenga en cuenta que una validación IDN solo se realizará si tiene habilidada la validación para nombres de host DNS.

Validación de dominios de nivel superior

Por defecto un nombre de host se cotejará con una lista de TLDs conocidos. Si esta funcionalidad no es necesaria, puede ser desactivada en la misma forma que deshabilita el soporte IDN. Puede deshabilitar la validación TLD pasando un tercer parámetro al constructor ZendValidateHostname. En el siguiente ejemplo estamos dando respaldo a la validación IDN a través del segundo parámetro.

1
2
3
4
5
6
7
8
$validator =
    new Zend\Validate\Hostname(
        array(
            'allow' => Zend\Validate\Hostname::ALLOW_DNS,
            'idn'   => true,
            'tld'   => false
        )
    );

Alternativamente puede pasar TRUE o FALSE a setValidateTld() para activar o desactivar la validación TLD.

Tenga en cuenta que una validación de TLDs solo se realizará si tiene habilitada la validación para nombres de host DNS.

Iban

Returns TRUE if and only if $value contains a valid IBAN (International Bank Account Number). IBAN numbers are validated against the country where they are used and by a checksum.

There are two ways to validate IBAN numbers. As first way you can give a locale which represents a country. Any given IBAN number will then be validated against this country.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$validator = new Zend\Validate\Iban('de_AT');
$iban = 'AT611904300234573201';
if ($validator->isValid($iban)) {
    // IBAN appears to be valid
} else {
    // IBAN is invalid
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

This should be done when you want to validate IBAN numbers for a single countries. The simpler way of validation is not to give a locale like shown in the next example.

1
2
3
4
5
6
7
$validator = new Zend\Validate\Iban();
$iban = 'AT611904300234573201';
if ($validator->isValid($iban)) {
    // IBAN appears to be valid
} else {
    // IBAN is invalid
}

But this shows one big problem: When you have to accept only IBAN numbers from one single country, for example france, then IBAN numbers from other countries would also be valid. Therefor just remember: When you have to validate a IBAN number against a defined country you should give the locale. And when you accept all IBAN numbers regardless of any country omit the locale for simplicity.

InArray

Devuelve TRUE si y sólo si $valor se encuentra en un array, y si la opción es estricta entonces también verificará el tipo de dato de $valor.

Int

Returns TRUE if and only if $value is a valid integer. Since Zend Framework 1.8 this validator takes into account the actual locale from browser, environment or application wide set locale. You can of course use the get/setLocale accessors to change the used locale or give it while creating a instance of this validator.

LessThan

Devuelve TRUE si y sólo si $valor es menor al límite máximo.

Regex

Devuelve TRUE si y sólo si $valor coincide con el patrón de una expresión regular.

StringLength

Devuelve TRUE si y sólo si la longitud del string $valor es por lo menos un mínimo y no mayor a un máximo (cuando la opción max no es NULL). Desde la versión 1.5.0, el método setMin() lanza una excepción si la longitud mínima tiene un valor mayor que la longitud máxima establecida, y el método setMax() lanza una excepción si la longitud máxima se fija a un valor inferior que la longitud mínima establecida. Desde la versión 1.0.2, esta clase soporta UTF-8 y a otras codificaciones, basado en el valor actual de: iconv.internal_encoding. If you need a different encoding you can set it with the accessor methods getEncoding and setEncoding.