/system/helpers/valid.php
PHP | 313 lines | 140 code | 38 blank | 135 comment | 16 complexity | 44a9cb929fea807c18ae39691fecf634 MD5 | raw file
- <?php defined('SYSPATH') or die('No direct script access.');
- /**
- * Validation helper class.
- *
- * $Id: valid.php 3238 2008-07-30 15:42:28Z Shadowhand $
- *
- * @package Core
- * @author Kohana Team
- * @copyright (c) 2007-2008 Kohana Team
- * @license http://kohanaphp.com/license.html
- */
- class valid_Core {
- /**
- * Validate email, commonly used characters only
- *
- * @param string email address
- * @return boolean
- */
- public static function email($email)
- {
- return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', (string) $email);
- }
- /**
- * Validate the domain of an email address by checking if the domain has a
- * valid MX record.
- *
- * @param string email address
- * @return boolean
- */
- public static function email_domain($email)
- {
- // If we can't prove the domain is invalid, consider it valid
- // Note: checkdnsrr() is not implemented on Windows platforms
- if ( ! function_exists('checkdnsrr'))
- return TRUE;
- // Check if the email domain has a valid MX record
- return (bool) checkdnsrr(preg_replace('/^[^@]+@/', '', $email), 'MX');
- }
- /**
- * Validate email, RFC compliant version
- * Note: This function is LESS strict than valid_email. Choose carefully.
- *
- * @see Originally by Cal Henderson, modified to fit Kohana syntax standards:
- * @see http://www.iamcal.com/publish/articles/php/parsing_email/
- * @see http://www.w3.org/Protocols/rfc822/
- *
- * @param string email address
- * @return boolean
- */
- public static function email_rfc($email)
- {
- $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
- $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
- $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
- $pair = '\\x5c[\\x00-\\x7f]';
- $domain_literal = "\\x5b($dtext|$pair)*\\x5d";
- $quoted_string = "\\x22($qtext|$pair)*\\x22";
- $sub_domain = "($atom|$domain_literal)";
- $word = "($atom|$quoted_string)";
- $domain = "$sub_domain(\\x2e$sub_domain)*";
- $local_part = "$word(\\x2e$word)*";
- $addr_spec = "$local_part\\x40$domain";
- return (bool) preg_match('/^'.$addr_spec.'$/D', (string) $email);
- }
- /**
- * Validate URL
- *
- * @param string URL
- * @return boolean
- */
- public static function url($url)
- {
- return (bool) filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED);
- }
- /**
- * Validate IP
- *
- * @param string IP address
- * @param boolean allow IPv6 addresses
- * @return boolean
- */
- public static function ip($ip, $ipv6 = FALSE)
- {
- // Do not allow private and reserved range IPs
- $flags = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
- if ($ipv6 === TRUE)
- return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flags);
- return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flags | FILTER_FLAG_IPV4);
- }
- /**
- * Validates a credit card number using the Luhn (mod10) formula.
- * @see http://en.wikipedia.org/wiki/Luhn_algorithm
- *
- * @param integer credit card number
- * @param string|array card type, or an array of card types
- * @return boolean
- */
- public static function credit_card($number, $type = NULL)
- {
- // Remove all non-digit characters from the number
- if (($number = preg_replace('/\D+/', '', $number)) === '')
- return FALSE;
- if ($type == NULL)
- {
- // Use the default type
- $type = 'default';
- }
- elseif (is_array($type))
- {
- foreach ($type as $t)
- {
- // Test each type for validity
- if (valid::credit_card($number, $t))
- return TRUE;
- }
- return FALSE;
- }
- $cards = Kohana::config('credit_cards');
- // Check card type
- $type = strtolower($type);
- if ( ! isset($cards[$type]))
- return FALSE;
- // Check card number length
- $length = strlen($number);
- // Validate the card length by the card type
- if ( ! in_array($length, preg_split('/\D+/', $cards[$type]['length'])))
- return FALSE;
- // Check card number prefix
- if ( ! preg_match('/^'.$cards[$type]['prefix'].'/', $number))
- return FALSE;
- // No Luhn check required
- if ($cards[$type]['luhn'] == FALSE)
- return TRUE;
- // Checksum of the card number
- $checksum = 0;
- for ($i = $length - 1; $i >= 0; $i -= 2)
- {
- // Add up every 2nd digit, starting from the right
- $checksum += substr($number, $i, 1);
- }
- for ($i = $length - 2; $i >= 0; $i -= 2)
- {
- // Add up every 2nd digit doubled, starting from the right
- $double = substr($number, $i, 1) * 2;
- // Subtract 9 from the double where value is greater than 10
- $checksum += ($double >= 10) ? $double - 9 : $double;
- }
- // If the checksum is a multiple of 10, the number is valid
- return ($checksum % 10 === 0);
- }
- /**
- * Checks if a phone number is valid.
- *
- * @param string phone number to check
- * @return boolean
- */
- public static function phone($number, $lengths = NULL)
- {
- if ( ! is_array($lengths))
- {
- $lengths = array(7,10,11);
- }
- // Remove all non-digit characters from the number
- $number = preg_replace('/\D+/', '', $number);
- // Check if the number is within range
- return in_array(strlen($number), $lengths);
- }
- /**
- * Checks whether a string consists of alphabetical characters only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^\pL++$/uD', (string) $str)
- : ctype_alpha((string) $str);
- }
- /**
- * Checks whether a string consists of alphabetical characters and numbers only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha_numeric($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^[\pL\pN]++$/uD', (string) $str)
- : ctype_alnum((string) $str);
- }
- /**
- * Checks whether a string consists of alphabetical characters, numbers, underscores and dashes only.
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function alpha_dash($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^[-\pL\pN_]++$/uD', (string) $str)
- : (bool) preg_match('/^[-a-z0-9_]++$/iD', (string) $str);
- }
- /**
- * Checks whether a string consists of digits only (no dots or dashes).
- *
- * @param string input string
- * @param boolean trigger UTF-8 compatibility
- * @return boolean
- */
- public static function digit($str, $utf8 = FALSE)
- {
- return ($utf8 === TRUE)
- ? (bool) preg_match('/^\pN++$/uD', (string) $str)
- : ctype_digit((string) $str);
- }
- /**
- * Checks whether a string is a valid number (negative and decimal numbers allowed).
- *
- * @param string input string
- * @return boolean
- */
- public static function numeric($str)
- {
- return (is_numeric($str) AND preg_match('/^[-0-9.]++$/D', (string) $str));
- }
- /**
- * Checks whether a string is a valid text. Letters, numbers, whitespace,
- * dashes, periods, and underscores are allowed.
- *
- * @param string $str
- * @return boolean
- */
- public static function standard_text($str)
- {
- return (bool) preg_match('/^[-\pL\pN\pZ_.]++$/uD', (string) $str);
- }
- /**
- * Checks if a string is a proper decimal format. The format array can be
- * used to specify a decimal length, or a number and decimal length, eg:
- * array(2) would force the number to have 2 decimal places, array(4,2)
- * would force the number to have 4 digits and 2 decimal places.
- *
- * @param string input string
- * @param array decimal format: y or x,y
- * @return boolean
- */
- public static function decimal($str, $format = NULL)
- {
- // Create the pattern
- $pattern = '/^[0-9]%s\.[0-9]%s$/';
- if ( ! empty($format))
- {
- if (count($format) > 1)
- {
- // Use the format for number and decimal length
- $pattern = sprintf($pattern, '{'.$format[0].'}', '{'.$format[1].'}');
- }
- elseif (count($format) > 0)
- {
- // Use the format as decimal length
- $pattern = sprintf($pattern, '+', '{'.$format[0].'}');
- }
- }
- else
- {
- // No format
- $pattern = sprintf($pattern, '+', '+');
- }
- return (bool) preg_match($pattern, (string) $str);
- }
- } // End valid