pax_global_header00006660000000000000000000000064117463616370014530gustar00rootroot0000000000000052 comment=e53fb374d31e59b8fe1c023fa8db074426cee347 php-validate-0.8.5/000077500000000000000000000000001174636163700141205ustar00rootroot00000000000000php-validate-0.8.5/Validate-0.8.5/000077500000000000000000000000001174636163700163175ustar00rootroot00000000000000php-validate-0.8.5/Validate-0.8.5/LICENSE000066400000000000000000000025071174636163700173300ustar00rootroot00000000000000Redistribution and use in source and binary forms, with or without modification , are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, th is list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/ or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WA RRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABIL ITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR C ONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOW EVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILI TY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE U SE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. php-validate-0.8.5/Validate-0.8.5/Validate.php000066400000000000000000001207551174636163700205730ustar00rootroot00000000000000 * Pierre-Alain Joye * Amir Mohammad Saied * * * Package to validate various datas. It includes : * - numbers (min/max, decimal or not) * - email (syntax, domain check) * - string (predifined type alpha upper and/or lowercase, numeric,...) * - date (min, max, rfc822 compliant) * - uri (RFC2396) * - possibility valid multiple data with a single method call (::multiple) * * @category Validate * @package Validate * @author Tomas V.V.Cox * @author Pierre-Alain Joye * @author Amir Mohammad Saied * @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version CVS: $Id$ * @link http://pear.php.net/package/Validate */ // {{{ Constants /** * Methods for common data validations */ define('VALIDATE_NUM', '0-9'); define('VALIDATE_SPACE', '\s'); define('VALIDATE_ALPHA_LOWER', 'a-z'); define('VALIDATE_ALPHA_UPPER', 'A-Z'); define('VALIDATE_ALPHA', VALIDATE_ALPHA_LOWER . VALIDATE_ALPHA_UPPER); define('VALIDATE_EALPHA_LOWER', VALIDATE_ALPHA_LOWER . 'áéíóúýàèìòùäëïöüÿâêîôûãñõ¨åæç½ðøþß'); define('VALIDATE_EALPHA_UPPER', VALIDATE_ALPHA_UPPER . 'ÁÉÍÓÚÝÀÈÌÒÙÄËÏÖܾÂÊÎÔÛÃÑÕ¦ÅÆÇ¼ÐØÞ'); define('VALIDATE_EALPHA', VALIDATE_EALPHA_LOWER . VALIDATE_EALPHA_UPPER); define('VALIDATE_PUNCTUATION', VALIDATE_SPACE . '\.,;\:&"\'\?\!\(\)'); define('VALIDATE_NAME', VALIDATE_EALPHA . VALIDATE_SPACE . "'" . '\-'); define('VALIDATE_STREET', VALIDATE_NUM . VALIDATE_NAME . "/\\ºª\."); define('VALIDATE_ITLD_EMAILS', 1); define('VALIDATE_GTLD_EMAILS', 2); define('VALIDATE_CCTLD_EMAILS', 4); define('VALIDATE_ALL_EMAILS', 8); // }}} /** * Validation class * * Package to validate various datas. It includes : * - numbers (min/max, decimal or not) * - email (syntax, domain check) * - string (predifined type alpha upper and/or lowercase, numeric,...) * - date (min, max) * - uri (RFC2396) * - possibility valid multiple data with a single method call (::multiple) * * @category Validate * @package Validate * @author Tomas V.V.Cox * @author Pierre-Alain Joye * @author Amir Mohammad Saied * @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version Release: @package_version@ * @link http://pear.php.net/package/Validate */ class Validate { // {{{ International, Generic and Country code TLDs /** * International Top-Level Domain * * This is an array of the known international * top-level domain names. * * @access protected * @var array $_iTld (International top-level domains) */ var $_itld = array( 'arpa', 'root', ); /** * Generic top-level domain * * This is an array of the official * generic top-level domains. * * @access protected * @var array $_gTld (Generic top-level domains) */ var $_gtld = array( 'aero', 'biz', 'cat', 'com', 'coop', 'edu', 'gov', 'info', 'int', 'jobs', 'mil', 'mobi', 'museum', 'name', 'net', 'org', 'pro', 'travel', 'asia', 'post', 'tel', 'geo', ); /** * Country code top-level domains * * This is an array of the official country * codes top-level domains * * @access protected * @var array $_ccTld (Country Code Top-Level Domain) */ var $_cctld = array( 'ac', 'ad','ae','af','ag', 'ai','al','am','an', 'ao','aq','ar','as', 'at','au','aw','ax', 'az','ba','bb','bd', 'be','bf','bg','bh', 'bi','bj','bm','bn', 'bo','br','bs','bt', 'bu','bv','bw','by', 'bz','ca','cc','cd', 'cf','cg','ch','ci', 'ck','cl','cm','cn', 'co','cr','cs','cu', 'cv','cx','cy','cz', 'de','dj','dk','dm', 'do','dz','ec','ee', 'eg','eh','er','es', 'et','eu','fi','fj', 'fk','fm','fo','fr', 'ga','gb','gd','ge', 'gf','gg','gh','gi', 'gl','gm','gn','gp', 'gq','gr','gs','gt', 'gu','gw','gy','hk', 'hm','hn','hr','ht', 'hu','id','ie','il', 'im','in','io','iq', 'ir','is','it','je', 'jm','jo','jp','ke', 'kg','kh','ki','km', 'kn','kp','kr','kw', 'ky','kz','la','lb', 'lc','li','lk','lr', 'ls','lt','lu','lv', 'ly','ma','mc','md', 'me','mg','mh','mk', 'ml','mm','mn','mo', 'mp','mq','mr','ms', 'mt','mu','mv','mw', 'mx','my','mz','na', 'nc','ne','nf','ng', 'ni','nl','no','np', 'nr','nu','nz','om', 'pa','pe','pf','pg', 'ph','pk','pl','pm', 'pn','pr','ps','pt', 'pw','py','qa','re', 'ro','rs','ru','rw', 'sa','sb','sc','sd', 'se','sg','sh','si', 'sj','sk','sl','sm', 'sn','so','sr','st', 'su','sv','sy','sz', 'tc','td','tf','tg', 'th','tj','tk','tl', 'tm','tn','to','tp', 'tr','tt','tv','tw', 'tz','ua','ug','uk', 'us','uy','uz','va', 'vc','ve','vg','vi', 'vn','vu','wf','ws', 'ye','yt','yu','za', 'zm','zw', ); // }}} /** * Validate a tag URI (RFC4151) * * @param string $uri tag URI to validate * * @return boolean true if valid tag URI, false if not * * @access private */ function __uriRFC4151($uri) { $datevalid = false; if (preg_match( '/^tag:(?.*),(?\d{4}-?\d{0,2}-?\d{0,2}):(?.*)(.*:)*$/', $uri, $matches)) { $date = $matches['date']; $date6 = strtotime($date); if ((strlen($date) == 4) && $date <= date('Y')) { $datevalid = true; } elseif ((strlen($date) == 7) && ($date6 < strtotime("now"))) { $datevalid = true; } elseif ((strlen($date) == 10) && ($date6 < strtotime("now"))) { $datevalid = true; } if (self::email($matches['name'])) { $namevalid = true; } else { $namevalid = self::email('info@' . $matches['name']); } return $datevalid && $namevalid; } else { return false; } } /** * Validate a number * * @param string $number Number to validate * @param array $options array where: * 'decimal' is the decimal char or false when decimal * not allowed. * i.e. ',.' to allow both ',' and '.' * 'dec_prec' Number of allowed decimals * 'min' minimum value * 'max' maximum value * * @return boolean true if valid number, false if not * * @access public */ function number($number, $options = array()) { $decimal = $dec_prec = $min = $max = null; if (is_array($options)) { extract($options); } $dec_prec = $dec_prec ? "{1,$dec_prec}" : '+'; $dec_regex = $decimal ? "[$decimal][0-9]$dec_prec" : ''; if (!preg_match("|^[-+]?\s*[0-9]+($dec_regex)?\$|", $number)) { return false; } if ($decimal != '.') { $number = strtr($number, $decimal, '.'); } $number = (float)str_replace(' ', '', $number); if ($min !== null && $min > $number) { return false; } if ($max !== null && $max < $number) { return false; } return true; } /** * Converting a string to UTF-7 (RFC 2152) * * @param string $string string to be converted * * @return string converted string * * @access private */ function __stringToUtf7($string) { $return = ''; $utf7 = array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', ',' ); $state = 0; if (!empty($string)) { $i = 0; while ($i <= strlen($string)) { $char = substr($string, $i, 1); if ($state == 0) { if ((ord($char) >= 0x7F) || (ord($char) <= 0x1F)) { if ($char) { $return .= '&'; } $state = 1; } elseif ($char == '&') { $return .= '&-'; } else { $return .= $char; } } elseif (($i == strlen($string) || !((ord($char) >= 0x7F)) || (ord($char) <= 0x1F))) { if ($state != 1) { if (ord($char) > 64) { $return .= ''; } else { $return .= $utf7[ord($char)]; } } $return .= '-'; $state = 0; } else { switch($state) { case 1: $return .= $utf7[ord($char) >> 2]; $residue = (ord($char) & 0x03) << 4; $state = 2; break; case 2: $return .= $utf7[$residue | (ord($char) >> 4)]; $residue = (ord($char) & 0x0F) << 2; $state = 3; break; case 3: $return .= $utf7[$residue | (ord($char) >> 6)]; $return .= $utf7[ord($char) & 0x3F]; $state = 1; break; } } $i++; } return $return; } return ''; } /** * Validate an email according to full RFC822 (inclusive human readable part) * * @param string $email email to validate, * will return the address for optional dns validation * @param array $options email() options * * @return boolean true if valid email, false if not * * @access private */ function __emailRFC822(&$email, &$options) { static $address = null; static $uncomment = null; if (!$address) { // atom = 1* $atom = '[^][()<>@,;:\\".\s\000-\037\177-\377]+\s*'; // qtext = , ; => may be folded // "\" & CR, and including linear-white-space> $qtext = '[^"\\\\\r]'; // quoted-pair = "\" CHAR ; may quote any char $quoted_pair = '\\\\.'; // quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or // ; quoted chars. $quoted_string = '"(?:' . $qtext . '|' . $quoted_pair . ')*"\s*'; // word = atom / quoted-string $word = '(?:' . $atom . '|' . $quoted_string . ')'; // local-part = word *("." word) ; uninterpreted // ; case-preserved $local_part = $word . '(?:\.\s*' . $word . ')*'; // dtext = may be folded // "]", "\" & CR, & including linear-white-space> $dtext = '[^][\\\\\r]'; // domain-literal = "[" *(dtext / quoted-pair) "]" $domain_literal = '\[(?:' . $dtext . '|' . $quoted_pair . ')*\]\s*'; // sub-domain = domain-ref / domain-literal // domain-ref = atom ; symbolic reference $sub_domain = '(?:' . $atom . '|' . $domain_literal . ')'; // domain = sub-domain *("." sub-domain) $domain = $sub_domain . '(?:\.\s*' . $sub_domain . ')*'; // addr-spec = local-part "@" domain ; global address $addr_spec = $local_part . '@\s*' . $domain; // route = 1#("@" domain) ":" ; path-relative $route = '@' . $domain . '(?:,@\s*' . $domain . ')*:\s*'; // route-addr = "<" [route] addr-spec ">" $route_addr = '<\s*(?:' . $route . ')?' . $addr_spec . '>\s*'; // phrase = 1*word ; Sequence of words $phrase = $word . '+'; // mailbox = addr-spec ; simple address // / phrase route-addr ; name & addr-spec $mailbox = '(?:' . $addr_spec . '|' . $phrase . $route_addr . ')'; // group = phrase ":" [#mailbox] ";" $group = $phrase . ':\s*(?:' . $mailbox . '(?:,\s*' . $mailbox . ')*)?;\s*'; // address = mailbox ; one addressee // / group ; named list $address = '/^\s*(?:' . $mailbox . '|' . $group . ')$/'; $uncomment = '/((?:(?:\\\\"|[^("])*(?:' . $quoted_string . ')?)*)((?{$tmpVar}; } $e = $self->executeFullEmailValidation($email, $toValidate); return $e; } /** * Execute the validation * * This function will execute the full email vs tld * validation using an array of tlds passed to it. * * @param string $email The email to validate. * @param array $arrayOfTLDs The array of the TLDs to validate * * @access public * * @return true or false (Depending on if it validates or if it does not) */ function executeFullEmailValidation($email, $arrayOfTLDs) { $emailEnding = explode('.', $email); $emailEnding = $emailEnding[count($emailEnding)-1]; foreach ($arrayOfTLDs as $validator => $keys) { if (in_array($emailEnding, $keys)) { return true; } } return false; } /** * Validate an email * * @param string $email email to validate * @param mixed boolean (BC) $check_domain Check or not if the domain exists * array $options associative array of options * 'check_domain' boolean Check or not if the domain exists * 'use_rfc822' boolean Apply the full RFC822 grammar * * Ex. * $options = array( * 'check_domain' => 'true', * 'fullTLDValidation' => 'true', * 'use_rfc822' => 'true', * 'VALIDATE_GTLD_EMAILS' => 'true', * 'VALIDATE_CCTLD_EMAILS' => 'true', * 'VALIDATE_ITLD_EMAILS' => 'true', * ); * * @return boolean true if valid email, false if not * * @access public */ function email($email, $options = null) { $check_domain = false; $use_rfc822 = false; if (is_bool($options)) { $check_domain = $options; } elseif (is_array($options)) { extract($options); } /** * Check for IDN usage so we can encode the domain as Punycode * before continuing. */ $hasIDNA = false; if (Validate::_includePathFileExists('Net/IDNA.php')) { include_once('Net/IDNA.php'); $hasIDNA = true; } if ($hasIDNA === true) { if (strpos($email, '@') !== false) { $tmpEmail = explode('@', $email); $domain = array_pop($tmpEmail); // Check if the domain contains characters > 127 which means // it's an idn domain name. $chars = count_chars($domain, 1); if (!empty($chars) && max(array_keys($chars)) > 127) { $idna =& Net_IDNA::singleton(); $domain = $idna->encode($domain); } array_push($tmpEmail, $domain); $email = implode('@', $tmpEmail); } } /** * @todo Fix bug here.. even if it passes this, it won't be passing * The regular expression below */ if (isset($fullTLDValidation)) { //$valid = Validate::_fullTLDValidation($email, $fullTLDValidation); $valid = Validate::_fullTLDValidation($email, $options); if (!$valid) { return false; } } // the base regexp for address $regex = '&^(?: # recipient: ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")| #1 quoted name ([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*)) #2 OR dot-atom @(((\[)? #3 domain, 4 as IPv4, 5 optionally bracketed (?:(?:(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.){3} (?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))))(?(5)\])| ((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z0-9](?:[-a-z0-9]*[a-z0-9])?) #6 domain as hostname \.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD $&xi'; //checks if exists the domain (MX or A) if ($use_rfc822? Validate::__emailRFC822($email, $options) : preg_match($regex, $email)) { if ($check_domain && function_exists('checkdnsrr')) { $domain = preg_replace('/[^-a-z.0-9]/i', '', array_pop(explode('@', $email))); if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) { return true; } return false; } return true; } return false; } /** * Validate a string using the given format 'format' * * @param string $string String to validate * @param array $options Options array where: * 'format' is the format of the string * Ex:VALIDATE_NUM . VALIDATE_ALPHA (see constants) * 'min_length' minimum length * 'max_length' maximum length * * @return boolean true if valid string, false if not * * @access public */ function string($string, $options) { $format = null; $min_length = 0; $max_length = 0; if (is_array($options)) { extract($options); } if ($format && !preg_match("|^[$format]*\$|s", $string)) { return false; } if ($min_length && strlen($string) < $min_length) { return false; } if ($max_length && strlen($string) > $max_length) { return false; } return true; } /** * Validate an URI (RFC2396) * This function will validate 'foobarstring' by default, to get it to validate * only http, https, ftp and such you have to pass it in the allowed_schemes * option, like this: * * $options = array('allowed_schemes' => array('http', 'https', 'ftp')) * var_dump(Validate::uri('http://www.example.org', $options)); * * * NOTE 1: The rfc2396 normally allows middle '-' in the top domain * e.g. http://example.co-m should be valid * However, as '-' is not used in any known TLD, it is invalid * NOTE 2: As double shlashes // are allowed in the path part, only full URIs * including an authority can be valid, no relative URIs * the // are mandatory (optionally preceeded by the 'sheme:' ) * NOTE 3: the full complience to rfc2396 is not achieved by default * the characters ';/?:@$,' will not be accepted in the query part * if not urlencoded, refer to the option "strict'" * * @param string $url URI to validate * @param array $options Options used by the validation method. * key => type * 'domain_check' => boolean * Whether to check the DNS entry or not * 'allowed_schemes' => array, list of protocols * List of allowed schemes ('http', * 'ssh+svn', 'mms') * 'strict' => string the refused chars * in query and fragment parts * default: ';/?:@$,' * empty: accept all rfc2396 foreseen chars * * @return boolean true if valid uri, false if not * * @access public */ function uri($url, $options = null) { $strict = ';/?:@$,'; $domain_check = false; $allowed_schemes = null; if (is_array($options)) { extract($options); } if (is_array($allowed_schemes) && in_array("tag", $allowed_schemes) ) { if (strpos($url, "tag:") === 0) { return self::__uriRFC4151($url); } } if (preg_match( '&^(?:([a-z][-+.a-z0-9]*):)? # 1. scheme (?:// # authority start (?:((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();:\&=+$,])*)@)? # 2. authority-userinfo (?:((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z](?:[a-z0-9]+)?\.?) # 3. authority-hostname OR |([0-9]{1,3}(?:\.[0-9]{1,3}){3})) # 4. authority-ipv4 (?::([0-9]*))?) # 5. authority-port ((?:/(?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'():@\&=+$,;])*)*/?)? # 6. path (?:\?([^#]*))? # 7. query (?:\#((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();/?:@\&=+$,])*))? # 8. fragment $&xi', $url, $matches)) { $scheme = isset($matches[1]) ? $matches[1] : ''; $authority = isset($matches[3]) ? $matches[3] : '' ; if (is_array($allowed_schemes) && !in_array($scheme, $allowed_schemes) ) { return false; } if (!empty($matches[4])) { $parts = explode('.', $matches[4]); foreach ($parts as $part) { if ($part > 255) { return false; } } } elseif ($domain_check && function_exists('checkdnsrr')) { if (!checkdnsrr($authority, 'A')) { return false; } } if ($strict) { $strict = '#[' . preg_quote($strict, '#') . ']#'; if ((!empty($matches[7]) && preg_match($strict, $matches[7])) || (!empty($matches[8]) && preg_match($strict, $matches[8]))) { return false; } } return true; } return false; } /** * Validate date and times. Note that this method need the Date_Calc class * * @param string $date Date to validate * @param array $options array options where : * 'format' The format of the date (%d-%m-%Y) * or rfc822_compliant * 'min' The date has to be greater * than this array($day, $month, $year) * or PEAR::Date object * 'max' The date has to be smaller than * this array($day, $month, $year) * or PEAR::Date object * * @return boolean true if valid date/time, false if not * * @access public */ function date($date, $options) { $max = false; $min = false; $format = ''; if (is_array($options)) { extract($options); } if (strtolower($format) == 'rfc822_compliant') { $preg = '&^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),) \s+ (?:(\d{2})?) \s+ (?:(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)?) \s+ (?:(\d{2}(\d{2})?)?) \s+ (?:(\d{2}?)):(?:(\d{2}?))(:(?:(\d{2}?)))? \s+ (?:[+-]\d{4}|UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Za-ik-z])$&xi'; if (!preg_match($preg, $date, $matches)) { return false; } $year = (int)$matches[4]; $months = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); $month = array_keys($months, $matches[3]); $month = (int)$month[0]+1; $day = (int)$matches[2]; $weekday = $matches[1]; $hour = (int)$matches[6]; $minute = (int)$matches[7]; isset($matches[9]) ? $second = (int)$matches[9] : $second = 0; if ((strlen($year) != 4) || ($day > 31 || $day < 1)|| ($hour > 23) || ($minute > 59) || ($second > 59)) { return false; } } else { $date_len = strlen($format); for ($i = 0; $i < $date_len; $i++) { $c = $format{$i}; if ($c == '%') { $next = $format{$i + 1}; switch ($next) { case 'j': case 'd': if ($next == 'j') { $day = (int)Validate::_substr($date, 1, 2); } else { $day = (int)Validate::_substr($date, 0, 2); } if ($day < 1 || $day > 31) { return false; } break; case 'm': case 'n': if ($next == 'm') { $month = (int)Validate::_substr($date, 0, 2); } else { $month = (int)Validate::_substr($date, 1, 2); } if ($month < 1 || $month > 12) { return false; } break; case 'Y': case 'y': if ($next == 'Y') { $year = Validate::_substr($date, 4); $year = (int)$year?$year:''; } else { $year = (int)(substr(date('Y'), 0, 2) . Validate::_substr($date, 2)); } if (strlen($year) != 4 || $year < 0 || $year > 9999) { return false; } break; case 'g': case 'h': if ($next == 'g') { $hour = Validate::_substr($date, 1, 2); } else { $hour = Validate::_substr($date, 2); } if (!preg_match('/^\d+$/', $hour) || $hour < 0 || $hour > 12) { return false; } break; case 'G': case 'H': if ($next == 'G') { $hour = Validate::_substr($date, 1, 2); } else { $hour = Validate::_substr($date, 2); } if (!preg_match('/^\d+$/', $hour) || $hour < 0 || $hour > 24) { return false; } break; case 's': case 'i': $t = Validate::_substr($date, 2); if (!preg_match('/^\d+$/', $t) || $t < 0 || $t > 59) { return false; } break; default: trigger_error("Not supported char `$next' after % in offset " . ($i+2), E_USER_WARNING); } $i++; } else { //literal if (Validate::_substr($date, 1) != $c) { return false; } } } } // there is remaing data, we don't want it if (strlen($date) && (strtolower($format) != 'rfc822_compliant')) { return false; } if (isset($day) && isset($month) && isset($year)) { if (!checkdate($month, $day, $year)) { return false; } if (strtolower($format) == 'rfc822_compliant') { if ($weekday != date("D", mktime(0, 0, 0, $month, $day, $year))) { return false; } } if ($min) { include_once 'Date/Calc.php'; if (is_a($min, 'Date') && (Date_Calc::compareDates($day, $month, $year, $min->getDay(), $min->getMonth(), $min->getYear()) < 0) ) { return false; } elseif (is_array($min) && (Date_Calc::compareDates($day, $month, $year, $min[0], $min[1], $min[2]) < 0) ) { return false; } } if ($max) { include_once 'Date/Calc.php'; if (is_a($max, 'Date') && (Date_Calc::compareDates($day, $month, $year, $max->getDay(), $max->getMonth(), $max->getYear()) > 0) ) { return false; } elseif (is_array($max) && (Date_Calc::compareDates($day, $month, $year, $max[0], $max[1], $max[2]) > 0) ) { return false; } } } return true; } /** * Substr * * @param string &$date Date * @param string $num Length * @param string $opt Unknown * * @access private * @return string */ function _substr(&$date, $num, $opt = false) { if ($opt && strlen($date) >= $opt && preg_match('/^[0-9]{'.$opt.'}/', $date, $m)) { $ret = $m[0]; } else { $ret = substr($date, 0, $num); } $date = substr($date, strlen($ret)); return $ret; } function _modf($val, $div) { if (function_exists('bcmod')) { return bcmod($val, $div); } elseif (function_exists('fmod')) { return fmod($val, $div); } $r = $val / $div; $i = intval($r); return intval($val - $i * $div + .1); } /** * Calculates sum of product of number digits with weights * * @param string $number number string * @param array $weights reference to array of weights * * @access protected * * @return int returns product of number digits with weights */ function _multWeights($number, &$weights) { if (!is_array($weights)) { return -1; } $sum = 0; $count = min(count($weights), strlen($number)); if ($count == 0) { // empty string or weights array return -1; } for ($i = 0; $i < $count; ++$i) { $sum += intval(substr($number, $i, 1)) * $weights[$i]; } return $sum; } /** * Calculates control digit for a given number * * @param string $number number string * @param array $weights reference to array of weights * @param int $modulo (optionsl) number * @param int $subtract (optional) number * @param bool $allow_high (optional) true if function can return number higher than 10 * * @access protected * * @return int -1 calculated control number is returned */ function _getControlNumber($number, &$weights, $modulo = 10, $subtract = 0, $allow_high = false) { // calc sum $sum = Validate::_multWeights($number, $weights); if ($sum == -1) { return -1; } $mod = Validate::_modf($sum, $modulo); // calculate control digit if ($subtract > $mod && $mod > 0) { $mod = $subtract - $mod; } if ($allow_high === false) { $mod %= 10; // change 10 to zero } return $mod; } /** * Validates a number * * @param string $number number to validate * @param array $weights reference to array of weights * @param int $modulo (optional) number * @param int $subtract (optional) number * * @access protected * * @return bool true if valid, false if not */ function _checkControlNumber($number, &$weights, $modulo = 10, $subtract = 0) { if (strlen($number) < count($weights)) { return false; } $target_digit = substr($number, count($weights), 1); $control_digit = Validate::_getControlNumber($number, $weights, $modulo, $subtract, $modulo > 10); if ($control_digit == -1) { return false; } if ($target_digit === 'X' && $control_digit == 10) { return true; } if ($control_digit != $target_digit) { return false; } return true; } /** * Bulk data validation for data introduced in the form of an * assoc array in the form $var_name => $value. * Can be used on any of Validate subpackages * * @param array $data Ex: array('name' => 'toto', 'email' => 'toto@thing.info'); * @param array $val_type Contains the validation type and all parameters used in. * 'val_type' is not optional * others validations properties must have the same name as the function * parameters. * Ex: array('toto'=>array('type'=>'string','format'='toto@thing.info','min_length'=>5)); * @param boolean $remove if set, the elements not listed in data will be removed * * @return array value name => true|false the value name comes from the data key * * @access public */ function multiple(&$data, &$val_type, $remove = false) { $keys = array_keys($data); $valid = array(); foreach ($keys as $var_name) { if (!isset($val_type[$var_name])) { if ($remove) { unset($data[$var_name]); } continue; } $opt = $val_type[$var_name]; $methods = get_class_methods('Validate'); $val2check = $data[$var_name]; // core validation method if (in_array(strtolower($opt['type']), $methods)) { //$opt[$opt['type']] = $data[$var_name]; $method = $opt['type']; unset($opt['type']); if (sizeof($opt) == 1 && is_array(reset($opt))) { $opt = array_pop($opt); } $valid[$var_name] = call_user_func(array('Validate', $method), $val2check, $opt); /** * external validation method in the form: * "" * Ex: us_ssn will include class Validate/US.php and call method ssn() */ } elseif (strpos($opt['type'], '_') !== false) { $validateType = explode('_', $opt['type']); $method = array_pop($validateType); $class = implode('_', $validateType); $classPath = str_replace('_', DIRECTORY_SEPARATOR, $class); $class = 'Validate_' . $class; if (Validate::_includePathFileExists("Validate/$classPath.php")) { include_once "Validate/$classPath.php"; } else { trigger_error("$class isn't installed or you may have some permission issues", E_USER_ERROR); } $ce = substr(phpversion(), 0, 1) > 4 ? class_exists($class, false) : class_exists($class); if (!$ce || !in_array($method, get_class_methods($class)) ) { trigger_error("Invalid validation type $class::$method", E_USER_WARNING); continue; } unset($opt['type']); if (sizeof($opt) == 1) { $opt = array_pop($opt); } $valid[$var_name] = call_user_func(array($class, $method), $data[$var_name], $opt); } else { trigger_error("Invalid validation type {$opt['type']}", E_USER_WARNING); } } return $valid; } /** * Determine whether specified file exists along the include path. * * @param string $filename file to search for * * @access private * * @return bool true if file exists */ function _includePathFileExists($filename) { $paths = explode(":", ini_get("include_path")); $result = false; while ((!($result)) && (list($key,$val) = each($paths))) { $result = file_exists($val . "/" . $filename); } return $result; } } php-validate-0.8.5/Validate-0.8.5/docs/000077500000000000000000000000001174636163700172475ustar00rootroot00000000000000php-validate-0.8.5/Validate-0.8.5/docs/Example_Locale.php000066400000000000000000000064651174636163700226450ustar00rootroot00000000000000 | // | Pierre-Alain Joye | // +----------------------------------------------------------------------+ // /** * Specific validation methods for data used in the [LocaleName] * * @category Validate * @package Validate_[LocaleName] * @author [Your Name] * @copyright 1997-2005 [Your name] * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version CVS: $Id$ * @link http://pear.php.net/package/Validate_[LocaleName] */ /** * Data validation class for the [LocaleName] * * This class provides methods to validate: * - SSN * - Postal code * - Telephone number * * @category Validate * @package Validate_[LocaleName] * @author [Your Name] * @copyright 1997-2005 [Your name] * @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @version Release: @package_version@ * @link http://pear.php.net/package/Validate_[LocaleName] */ class Validate_LocaleName { /** * validates a postcode * * [Further info goes here] * * @access public * @author [Your name] * @param string the postcode to be validated * @param bool optional; strong checks (e.g. against a list of postcodes) (not implanted) * * @return bool true on success false on failure */ function postalCode($postcode, $strong = false) { if (ctype_digit($number)) { return true; } return false; } /** * Validates a social security number * * [Further info goes here] * * @access public * @author [Your name] * @param string $ssn SSN * * @return bool true on success false on failure */ function ssn($ssn) { if (ctype_digit($number)) { return true; } return false; } /** * Validate a phone number * * [Further info goes here] * * @access public * @author [Your name] * @param string $number the tel number * * @return bool true on success false on failure */ function phoneNumber($number) { if (ctype_digit($number)) { return true; } return false; } } ?> php-validate-0.8.5/Validate-0.8.5/docs/sample_multiple.php000066400000000000000000000034521174636163700231600ustar00rootroot00000000000000 '13234,344343', 'name' => 'foo@example.com', 'rib' => array( 'codebanque' => '33287', 'codeguichet' => '00081', 'nocompte' => '00923458141C', 'key' => '52' ), 'rib2' => array( 'codebanque' => '12345', 'codeguichet' => '12345', 'nocompte' => '12345678901', 'key' => '46' ), 'cc' => '6762195515061813', 'cc2' => '6762195515061814', 'mail' => 'foo@example.com', 'hissiret' => '441 751 245 00016', 'mystring' => 'ABCDEabcde', 'iban' => 'CH10002300A1023502601', 'cep' => '12345-123' ); $opts = array( 'amount'=> array('type'=>'number','decimal'=>',.','dec_prec'=>null,'min'=>1,'max'=>32000), 'name' => array('type'=>'email','check_domain'=>false), 'rib' => array('type'=>'FR_rib'), 'rib2' => array('type'=>'FR_rib'), 'cc' => array('type'=>'Finance_CreditCard_number'), 'cc2' => array('type'=>'Finance_CreditCard_number'), 'mail' => array('type'=>'email'), 'hissiret' => array('type'=>'FR_siret'), 'mystring' => array('type'=>'string',array('format'=>VALIDATE_ALPHA, 'min_length'=>3)), 'iban' => array('type'=>'Finance_iban'), 'cep' => array('type'=>'ptBR_postalcode') ); $result = Validate::multiple($values, $opts); print_r($result); ?> php-validate-0.8.5/Validate-0.8.5/tests/000077500000000000000000000000001174636163700174615ustar00rootroot00000000000000php-validate-0.8.5/Validate-0.8.5/tests/email.phpt000066400000000000000000000111001174636163700214360ustar00rootroot00000000000000--TEST-- email.phpt: Unit tests for email validation --FILE-- true, 'VALIDATE_GTLD_EMAILS' => true)), array('example (though bad)@example.com', array('use_rfc822' => true)), // OK 'bugme@not./com', // OK // Some none english chars, those should fail until we fix the IDN stuff 'hjj@homms.com', // NOK '@example.com', // NOK 'postmaster@tv.de', // NOK // Test for various ways with _ 'mark_@example.com', // OK '_mark@example.com', // OK 'mark_foo@example.com', // OK // Test for various ways with - 'mark-@example.com', // OK '-mark@example.com', // OK 'mark-foo@example.com', // OK // Test for various ways with . 'mark.@example.com', // NOK '.mark@example.com', // NOK 'mark.foo@example.com', // OK // Test for various ways with , 'mark,@example.com', // NOK ',mark@example.com', // NOK 'mark,foo@example.com', // NOK // Test for various ways with : 'mark:@example.com', // NOK ':mark@example.com', // NOK 'mark:foo@example.com', // NOK // Test for various ways with ; 'mark;@example.com', // NOK ';mark@example.com', // NOK 'mark;foo@example.com', // NOK // Test for various ways with | 'mark|@example.com', // OK '|mark@example.com', // OK 'mark|foo@example.com', // OK // Test for various ways with double @ 'mark@home@example.com', // NOK 'mark@example.home@com', // NOK 'mark@example.com@home', // NOK // Killers ' tests 'ha"ho@example.com', // NOK 'blah@example.com', // NOK '@example.com', // NOK '"blah"@example.com', // OK '" "@example.com', // NOK '@example.com', // NOK // Minus ' tests (#5804) 'minus@example-minus.com', // OK 'minus@example.co-m', // OK 'mi-nus@example-minus.co-m', // OK 'minus@example-.com', // NOK 'minus@-example.com', // NOK 'minus@-.com', // NOK 'minus@example.-com', // NOK 'minus@-example.com-', // NOK // IP domain 'ip@127.0.0.1', // OK '"the ip"@[127.0.0.1]', // OK 'ip@127.0.333.1', // NOK 'ip@[277.0.0.1]', // NOK 'ip@[127.0.0.1', // NOK 'ip@127.0.0.1]' // NOK ); list($version) = explode(".", phpversion(), 2); foreach ($emails as $email) { if (is_array($email)) { echo "{$email[0]}:"; if (!is_array($email[1])) { echo " with". ($email[1] ? '' : 'out') . ' domain check :'; } echo ' ' . $noYes[Validate::email($email[0], $email[1])]."\n"; } else { echo "{$email}: "; if ((int)$version > 4) { try { echo $noYes[Validate::email($email)]."\n"; } catch (Exception $e) { echo $e->getMessage()."\n"; } } else { echo $noYes[Validate::email($email)]."\n"; } } } ?> --EXPECT-- Test Validate_Email example@fluffffffrefrffrfrfrfrfrfr.is: YES davidc@php.net: YES example (though bad)@example.com: YES bugme@not./com: YES hjj@homms.com: NO @example.com: NO postmaster@tv.de: NO mark_@example.com: YES _mark@example.com: YES mark_foo@example.com: YES mark-@example.com: YES -mark@example.com: YES mark-foo@example.com: YES mark.@example.com: NO .mark@example.com: NO mark.foo@example.com: YES mark,@example.com: NO ,mark@example.com: NO mark,foo@example.com: NO mark:@example.com: NO :mark@example.com: NO mark:foo@example.com: NO mark;@example.com: NO ;mark@example.com: NO mark;foo@example.com: NO mark|@example.com: YES |mark@example.com: YES mark|foo@example.com: YES mark@home@example.com: NO mark@example.home@com: NO mark@example.com@home: NO ha"ho@example.com: NO blah@example.com: NO @example.com: NO "blah"@example.com: YES " "@example.com: NO @example.com: NO minus@example-minus.com: YES minus@example.co-m: YES mi-nus@example-minus.co-m: YES minus@example-.com: NO minus@-example.com: NO minus@-.com: NO minus@example.-com: NO minus@-example.com-: NO ip@127.0.0.1: YES "the ip"@[127.0.0.1]: YES ip@127.0.333.1: NO ip@[277.0.0.1]: NO ip@[127.0.0.1: NO ip@127.0.0.1]: NO php-validate-0.8.5/Validate-0.8.5/tests/email_domaincheck.phpt000066400000000000000000000025231174636163700237740ustar00rootroot00000000000000--TEST-- domaincheck.phpt: Unit tests for email validation with dns checks --SKIPIF-- --FILE-- 4) { try { echo $noYes[Validate::email($email)]."\n"; } catch (Exception $e) { echo $e->getMessage()."\n"; } } else { echo $noYes[Validate::email($email)]."\n"; } } } ?> --EXPECT-- Test Validate_Email pear-general@lists.php.net: with domain check : YES example@fluffffffrefrffrfrfrfrfrfr.is: with domain check : NOphp-validate-0.8.5/Validate-0.8.5/tests/multicard.phpt000066400000000000000000000032551174636163700223470ustar00rootroot00000000000000--TEST-- multicard.phpt: Unit tests for 'Validate.php' : mutltiple() with credit card This test needs Validate_Finance_CreditCard installed to be enabled --SKIPIF-- --FILE-- array('type' => 'email'), 'myemail1' => array('type' => 'email'), 'no' => array('type' => 'number', array('min' => -8, 'max' => -7)), 'teststring' => array('type' => 'string', array('format' => VALIDATE_ALPHA)), 'date' => array('type' => 'date', array('format' => '%d%m%Y')), 'cc_no' => array('type' => 'Finance_CreditCard_number') ); $data = array( array( 'myemail' => 'webmaster@google.com', // OK 'myemail1' => 'webmaster.@google.com', // NOK 'no' => '-8', // OK 'teststring' => 'PEARrocks', // OK 'date' => '12121996', // OK 'cc_no' => '6762 1955 1506 1813' // OK ) ); echo "Test Validate_Multiple\n"; echo "**********************\n\n"; foreach ($data as $value) { $res = Validate::multiple($value, $types); foreach ($value as $fld=>$val) { echo "{$fld}: {$val} =>".(isset($res[$fld])? $noYes[$res[$fld]]: 'null')."\n"; } echo "*****************************************\n\n"; } ?> --EXPECT-- Test Validate_Multiple ********************** myemail: webmaster@google.com =>YES myemail1: webmaster.@google.com =>NO no: -8 =>YES teststring: PEARrocks =>YES date: 12121996 =>YES cc_no: 6762 1955 1506 1813 =>YES ***************************************** php-validate-0.8.5/Validate-0.8.5/tests/multiple.phpt000066400000000000000000000026761174636163700222240ustar00rootroot00000000000000--TEST-- multiple.phpt: Unit tests for 'Validate.php' without extension (credit card) --FILE-- array('type' => 'email'), 'myemail1' => array('type' => 'email'), 'no' => array('type' => 'number', array('min' => -8, 'max' => -7)), 'teststring' => array('type' => 'string', array('format' => VALIDATE_ALPHA)), 'test10844' => array('type' => 'string', 'format' => '0-9'), 'date' => array('type' => 'date', array('format' => '%d%m%Y')) ); $data = array( array( 'myemail' => 'webmaster@google.com', // OK 'myemail1' => 'webmaster.@google.com', // NOK 'no' => '-8', // OK 'teststring' => 'PEARrocks', // OK 'test10844' => 'dsfasdf', // NOK 'date' => '12121996' // OK ) ); echo "Test Validate_Multiple\n"; echo "**********************\n\n"; foreach ($data as $value) { $res = Validate::multiple($value, $types); foreach ($value as $fld=>$val) { echo "{$fld}: {$val} =>".(isset($res[$fld])? $noYes[$res[$fld]]: 'null')."\n"; } echo "*****************************************\n\n"; } ?> --EXPECT-- Test Validate_Multiple ********************** myemail: webmaster@google.com =>YES myemail1: webmaster.@google.com =>NO no: -8 =>YES teststring: PEARrocks =>YES test10844: dsfasdf =>NO date: 12121996 =>YES ***************************************** php-validate-0.8.5/Validate-0.8.5/tests/number.phpt000066400000000000000000000027751174636163700216610ustar00rootroot00000000000000--TEST-- number.phpt: Unit tests for 'Validate.php' --FILE-- ','), // NOK array('-8.0', 'decimal'=>','), // NOK array('-8,0', 'decimal'=>',', 'dec_prec'=>2), // OK array(8.0004, 'decimal'=>'.', 'dec_prec'=>3), // NOK array(8.0004, 'decimal'=>'.', 'dec_prec'=>4), // OK array('-8', 'min'=>1, 'max'=>9), // NOK array('-8', 'min'=>-8, 'max'=>-7), // OK array('-8.02', 'decimal'=>'.', 'min'=>-8, 'max'=>-7), // NOK array('-8.02', 'decimal'=>'.', 'min'=>-9, 'max'=>-7), // OK array('-8.02', 'decimal'=>'.,','min'=>-9, 'max'=>-7) // OK ); foreach($numbers as $data) { $number = array_shift($data); echo "{$number} ("; foreach ($data as $key=>$val) { echo "{$key}=>{$val} "; } echo "): ".$noYes[Validate::number($number,$data)]."\n"; } ?> --EXPECT-- Test Validate_Number ******************** 8 (): YES -8 (): YES -8 (): YES -8, (decimal=>, ): NO -8.0 (decimal=>, ): NO -8,0 (decimal=>, dec_prec=>2 ): YES 8.0004 (decimal=>. dec_prec=>3 ): NO 8.0004 (decimal=>. dec_prec=>4 ): YES -8 (min=>1 max=>9 ): NO -8 (min=>-8 max=>-7 ): YES -8.02 (decimal=>. min=>-8 max=>-7 ): NO -8.02 (decimal=>. min=>-9 max=>-7 ): YES -8.02 (decimal=>., min=>-9 max=>-7 ): YES php-validate-0.8.5/Validate-0.8.5/tests/testdate.phpt000066400000000000000000000057421174636163700222030ustar00rootroot00000000000000--TEST-- testdate.phpt: Unit tests for 'Validate.php' --INI-- date.timezone=UTC --FILE-- '%d%m%y'), // OK array('21202', 'format'=>'%d%m%y'), // NOK array('02122', 'format'=>'%y%m%d'), // NOK array('02229', 'format'=>'%y%d%m'), // NOK array('121402', 'format'=>'%d%m%y'), // NOK array('12120001', 'format'=>'%d%m%Y'), // OK /* Ambiguous date >> false * They should be still valid. Maybe by changing the loop * 1st check for the Y (4digits), and then m (2digits) * if you got the idea ;) */ array('220001', 'format'=>'%j%n%Y'), // NOK array('2299', 'format'=>'%j%n%y'), // NOK array('2120001', 'format'=>'%j%m%Y'), // NOK /* End */ array('12121999', 'format'=>'%d%m%Y', 'min'=>array('01','01','1995')), // OK array('12121996', 'format'=>'%d%m%Y', 'min'=>array('01','01','1995'), 'max'=>array('01','01','1997')), // OK array('29022002', 'format'=>'%d%m%Y'), // NOK array('12.12.1902', 'format'=>'%d.%m.%Y'), // OK array('12/12/1902', 'format'=>'%d/%m/%Y'), // OK array('12/12/1902', 'format'=>'%d/%m/%Y'), // OK array('12:12:1902', 'format'=>'%d:%m:%Y'), // OK array('12', 'format'=>'%g'), // OK array('12', 'format'=>'%G'), // OK array('13:00', 'format'=>'%g:%i'), // NOK array('24:59', 'format'=>'%G:%i'), // OK array('25:00', 'format'=>'%G:%i'), // NOK array('25:00', 'format'=>'%G:%i:%s'), // NOK array('121902', 'format'=>'%m%Y'), // OK array('13120001', 'format'=>'%d%m%Y') // OK ); echo "\nTest dates\n"; foreach ($dates as $data){ $date = array_shift($data); echo "{$date} ("; foreach ($data as $key=>$val) { if (is_array($val)) { echo "{$key}=>[ "; foreach($val as $elt) { echo "{$elt} "; } echo "] "; } else { echo "{$key}=>{$val} "; } } echo "): ".$noYes[Validate::date($date, $data)]."\n"; } ?> --EXPECT-- Test Validate_Date ****************** Test dates 121202 (format=>%d%m%y ): YES 21202 (format=>%d%m%y ): NO 02122 (format=>%y%m%d ): NO 02229 (format=>%y%d%m ): NO 121402 (format=>%d%m%y ): NO 12120001 (format=>%d%m%Y ): YES 220001 (format=>%j%n%Y ): NO 2299 (format=>%j%n%y ): NO 2120001 (format=>%j%m%Y ): NO 12121999 (format=>%d%m%Y min=>[ 01 01 1995 ] ): YES 12121996 (format=>%d%m%Y min=>[ 01 01 1995 ] max=>[ 01 01 1997 ] ): YES 29022002 (format=>%d%m%Y ): NO 12.12.1902 (format=>%d.%m.%Y ): YES 12/12/1902 (format=>%d/%m/%Y ): YES 12/12/1902 (format=>%d/%m/%Y ): YES 12:12:1902 (format=>%d:%m:%Y ): YES 12 (format=>%g ): YES 12 (format=>%G ): YES 13:00 (format=>%g:%i ): NO 24:59 (format=>%G:%i ): YES 25:00 (format=>%G:%i ): NO 25:00 (format=>%G:%i:%s ): NO 121902 (format=>%m%Y ): YES 13120001 (format=>%d%m%Y ): YES php-validate-0.8.5/Validate-0.8.5/tests/testdate_minmax.phpt000066400000000000000000000032501174636163700235440ustar00rootroot00000000000000--TEST-- Unit tests for date() with min / max functionality --INI-- date.timezone=UTC --SKIPIF-- --FILE-- '%d%m%Y', 'min' => new Date('19950101')), // OK array('12121996', 'format'=>'%d%m%Y', 'min' => new Date('19970101')), // NOK array('10101994', 'format'=>'%d%m%Y', 'max' => new Date('2005-04-27 06:24:05')), // OK array('11111994', 'format'=>'%d%m%Y', 'max' => new Date('19920101')), // NOK array('12121996', 'format'=>'%d%m%Y', 'min' => new Date('19950101'), 'max' => new Date('2005-04-27 06:24:05')) // OK ); echo "\nTest dates with min max object\n"; foreach ($dateObjects as $data){ $date = array_shift($data); echo "{$date} ("; foreach ($data as $key=>$val) { if (($key == 'min') or ($key == 'max')) { echo "{$key}=>".$val->getDate()." "; } else { echo "{$key}=>{$val} "; } } echo "): ".$noYes[Validate::date($date, $data)]."\n"; } ?> --EXPECT-- Test Validate_Date ****************** Test dates with min max object 11111996 (format=>%d%m%Y min=>1995-01-01 00:00:00 ): YES 12121996 (format=>%d%m%Y min=>1997-01-01 00:00:00 ): NO 10101994 (format=>%d%m%Y max=>2005-04-27 06:24:05 ): YES 11111994 (format=>%d%m%Y max=>1992-01-01 00:00:00 ): NO 12121996 (format=>%d%m%Y min=>1995-01-01 00:00:00 max=>2005-04-27 06:24:05 ): YES php-validate-0.8.5/Validate-0.8.5/tests/uri.phpt000066400000000000000000000066001174636163700211570ustar00rootroot00000000000000--TEST-- uri.phpt: Unit tests for Validate::uri() --FILE-- array('ftp', 'http')), // NOK array('http://example.org', 'allowed_schemes' => array('ftp', 'http')), // OK array( '//example.org/tkik-wkik_rss.php?ver=2http://www.hyperlecture.info//http://www.hyperlecture.info/accueil', 'strict' => ''), // OK /* the bjori's sequence */ 'http://domain.tld//', // OK 'http://domain.tld/.', // OK 'http://domain.tld/./folder/.././/.folder/subfolder/../../', // OK 'http://domain.tld//./' // OK ); foreach ($uris as $uri) { if (is_array($uri)) { $options = $uri; unset($options[0]); echo "{$uri[0]}: schemes(" . (isset($options['allowed_schemes']) ? implode(',', $options['allowed_schemes']) : '') .") with". (isset($options['domain_check']) && $options['domain_check'] ? '' : 'out') . ' domain check : '. (isset($options['strict']) ? "(strict : {$options['strict']}) " : '') . $noYes[Validate::uri($uri[0], $options )]."\n"; } else { echo "{$uri}: ". $noYes[Validate::uri($uri)]."\n"; } } ?> --EXPECT-- Test Validate::uri() not @ goodurl123: NO http://www.example.com//: YES http://www.example.com/: YES http://www.ics.uci.edu/pub/ietf/uri/#Related: YES http://user:password@www.ics.uci.edu:8080/pub/ietf/uri;rfc2396?test=ok&end=next#Related: YES //127.0.0.1: YES //127.0.333.1: NO http://user:password@127.0.0.1:8080/pub/ietf/uri;rfc2396?test=ok&end=next#Related: YES 127.0.0.1: NO //example.org/tkik-wkik_rss.php?ver=2http://www.hyperlecture.info//http://www.hyperlecture.info/accueil: NO //example-minus.com: YES //example.co-m: NO //example-.com: NO //-example.com: NO //-.com: NO //example.-com: NO //-example.com-: NO //example.org: schemes(ftp,http) without domain check : NO http://example.org: schemes(ftp,http) without domain check : YES //example.org/tkik-wkik_rss.php?ver=2http://www.hyperlecture.info//http://www.hyperlecture.info/accueil: schemes() without domain check : (strict : ) YES http://domain.tld//: YES http://domain.tld/.: YES http://domain.tld/./folder/.././/.folder/subfolder/../../: YES http://domain.tld//./: YES php-validate-0.8.5/Validate-0.8.5/tests/uri_domaincheck.phpt000066400000000000000000000027401174636163700235050ustar00rootroot00000000000000--TEST-- domaincheck.phpt: Unit tests for uri validation with dns check --SKIPIF-- --FILE-- true), // OK array('//example.gor', 'domain_check' => true), // NOK // Try schemes lookup array('http://php.net', 'allowed_schemes' => array('ftp', 'http'), 'domain_check' => true) // OK ); foreach ($uris as $uri) { if (is_array($uri)) { $options = $uri; unset($options[0]); echo "{$uri[0]}: schemes(" . (isset($options['allowed_schemes']) ? implode(',', $options['allowed_schemes']) : '') .") with". (isset($options['domain_check']) && $options['domain_check'] ? '' : 'out') . ' domain check : '. (isset($options['strict']) ? "(strict : {$options['strict']}) " : '') . $noYes[Validate::uri($uri[0], $options )]."\n"; } else { echo "{$uri}: ". $noYes[Validate::uri($uri)]."\n"; } } ?> --EXPECT-- Test Validate::uri() //php.net: schemes() with domain check : YES //example.gor: schemes() with domain check : NO http://php.net: schemes(ftp,http) with domain check : YES php-validate-0.8.5/package.xml000066400000000000000000000361071174636163700162440ustar00rootroot00000000000000 Validate pear.php.net Validation class Package to validate various datas. It includes : - numbers (min/max, decimal or not) - email (syntax, domain check, rfc822) - string (predifined type alpha upper and/or lowercase, numeric,...) - date (min, max, rfc822 compliant) - uri (RFC2396) - possibility valid multiple data with a single method call (::multiple) Pierre-Alain Joye pajoye pierre.php@gmail.com no Thomas V.V.Cox cox cox@php.net no Helgi Þormar Þorbjörnsson dufuz dufuz@php.net no Amir Mohammad Saied amir amirsaied@gmail.com yes David Coallier davidc david@echolibre.com yes bertrand Gugger toggg bertrand@toggg.com no Stefan Neufeind neufeind pear.neufeind@speedpartner.de no 2011-12-18 0.8.5 0.7.0 beta beta New BSD QA Release Request #17963: Allow test suite to run without DNS resolver [patch by remicollet, adjustments by dufuz] Bug #17279 Validate::email() with 'fullTLDValidation' => 'true' always return false. Bug #17947 testdate test fails if date.timezone not set Bug #17948 multicard test fails 4.2.0 1.4.0b1 Date pear.php.net Net_IDNA pear.php.net 0.7.1 2010-10-10 0.8.4 0.7.0 beta beta New BSD QA release Bug #17555 Use correct pattern delim Bug #17755 Encoding to UTF-8 in Validate.php Bug #17756 Avoiding ereg 2009-11-24 0.8.3 0.7.0 beta beta New BSD - * Bug #14865 Fixing some unit test failures (amir) - * Bug #15945 Improper string used to check domain dns (amir) - * Bug #16381 String format validation fails for VALIDATE_NAME.VALIDATE_XXX (amir) - * Bug #16427 Email Validation not working for check_domain (amir) - * Bug #16811 Should determine whether Net/IDNA.php is available less "destructively" (kguest) - 0.8.2 0.7.0 beta beta 2009-01-31 New BSD * Bug #12658: New lines at end of file create output (davidc) * Bug #11001 RFC822 Comments break PCRE (davidc) * Bug #14075 Validate::uri() rejects valid tag: URIs (davidc) * Bug #14866 Notice: Undefined index: VALIDATE_ITLD_EMAILS (amir) * Bug #14931 Warning: max(): Array must contain atleast one element (doconnor) * Doc Bug #14180 Typo in $modulo variable description (amir) * Doc Bug #14046 Docs desperately needed (amir) * Request #956 Validate::email() doesn't allow Internationalized Domain Names (IDN) (davidc) * Request #14791 Improve PHPCS Results [amir] * Removed Net_IDNA Dependency [davidc] 0.8.1 0.7.0 beta beta 2007-12-10 New BSD * Fix Bug #2662: Invalid email addresses are validated [dufuz] * Fix Bug #2936: Typo in sample_multiple.php [dufuz] * Fix Bug #4068: errant "return true;" in Validate_US::phoneNumber [dufuz] * Fix Bug #5390: XML Package Error [dufuz] * Fix Bug #7531: Email-checks need to be more RFC-compliant [amir] * Fix Bug #7648: VALIDATE_EALPHA does not include the Ã� character [amir] * Fix Bug #7864: uris rejected if subdomain contains underscores [amir] * Fix Bug #8442: Undefined variable "return" [amir] * Fix Bug #8629: eMail validation fails [amir] * Fix Bug #8768: Valid URL's are marked invalid [amir] * Fix Bug #8839: defect [amir] * Fix Bug #8851: date-validation allows letters in time. [amir] * Fix Bug #8853: E-Mail validation allows space before TLD [amir] * Fix Bug #9156: Missing characters in validation sequence [amir] * Fix Bug #9385: Missing characters in validation sequence [amir] * Fix Bug #9386: Missing punctuation mark (hyphen) in VALIDATE_NAME [amir] * Fix Bug #10044: email validation bug [davidc] * Fix Bug #10167: ISSN/ISBN validation is broken by _checkControlNumber [dufuz] * Fix Bug #10844: Validate::multiple() breaks by consolidating single field array [toggg] * Fix Bug #11073: date() %d validates \d{1,2} as correct [amir] * Fix Bug #11592: Email validation not working properly [davidc] * Fix Bug #12452: EALPHA_LOWER is missing a Ã� [thesaur] * Implement Feature #11244: documentation [davidc] * Implement Feature #8073: a@a is valid email [amir] * Removed dependency on Net_IDNA [davidc] 0.8.0 0.7.0 beta beta 2006-11-17 New BSD - string(): * New chars in VALIDATE_EALPHA_LOWER and UPPER - date(): * RFC822 date-time format compliant 0.6.5 0.6.5 beta beta 2006-10-05 New BSD - __stringToUtf7(): * #8442, Preventing a Notice - email(): * #8629, hostnames starting with numbers are valid because of their popularity * #8853, E-Mail validation allows space before TLD. - date(): * #8851, date-validation allows letters in time. 0.6.4 0.6.4 beta beta 2006-07-31 New BSD - string(): * #7648, Adding a new character to VALIDATE_EALPHA - email(): * #8073, a@a is a valid email address just in RFC restricted mode - email(): * #7531, utf-7 encoding - __stringToUtf7(): * new method added to do care about utf-7 0.6.3 0.6.3 beta beta 2006-04-20 New BSD - email(): * #6930, accepts options as an array to confirm to the Validate standard previous boolean $check_domain still accepted for backwards compatibility * #7176, introduces an experimental option "use_rfc822" which switch to a full RFC822 new checker * unit test enhanced and completed - class_exists call in mulitple() now passes false to the autoload param - uri(): * #6181, Accept URI terminating with a / * use !empty() instead of isset() * minus in the top domain as http://example.co-m is invalid * Double slashes are accepted in the path part (requested by bjori) As a consequence, only URIs with full authority can be valid, no relative URI * documentation header completed : usage notes , options and "strict" parameter * unit tests completed and updated , use php.net instead of unavailable example.org 0.6.2 0.6.2 beta beta 2005-11-04 New BSD - Change licence to the new BSD License (see http://www.opensource.org/licenses/bsd-license.php) - The path part in uri cannot contain two slash characters. - Refactored email() regexp, hardened hostname check (taken from uri()) (bug #5804) - Empty quoted email recipient is not valid, must at least contain a non blank char - Use & as delimiter as Ã�£ is problematic if the script is saved utf8 - Enhanced uri.phpt and email.phpt tests 0.6.1 0.6.1 beta beta 2005-09-13 New BSD - Bug #5390 XML Package Error - uri was enchanced to fully comply with RFC2396 (Bertrand) (forgotten in last release changelog) 0.6.0 0.6.0 beta beta 2005-09-13 New BSD - Move to Beta state - Enhance again email validation and unit test it - modulus methods fix if bcmath is not present 0.5.0 0.5.0 alpha alpha 2005-05-20 New BSD - Bug #2936, typo - Bug #2879, Issn wrong validation - Better email validation - Request #997 validate:date minium and maximum accept Date objects (By Torsten Roehr) - Request #4055 Making multiple() cope with new dir structure (By Torsten Roehr) To use with Validate_Finance_CreditCard then do 'type' => 'Finance_CreditCard_number' For Validate_US it would be 'type' => 'US_ssn' This applies to all packages like that under Validate. - unit testing for multiple (By Torsten Roehr) - CS fixes - Split country and finance classes and credit card functions into their own sub packages of Validate - New lead/developer (Helgi) - Few more none alpha chars added - _check_control_number renamed to _checkControlNumber _get_control_number renamed to _getControlNumber _mult_weights renamed to _multWeights - added email test - Split these functions over to a new sub package called Validate_ISPN (International Standard Product Numbers) * ISSN * ISBN * ISMN * EAN8 * EAN13 * EAN14 * UCC12 * SSCC - splited multiple() test in with (skipif not installed) or without card, 0.4.1 0.4.1 alpha alpha 2004-03-17 New BSD - fixed issue when validating IBANs via a static call - added missing test validate_UK.php to package.xml 0.4.0 0.4.0 alpha alpha 2004-03-16 New BSD - pt_BR moved to ptBR required for multiple support(BC break) - Add CH validation (Switzerland) - added Euro banknotes IDs - Improved UK postcodes validation - Fixed allowed_scheme options in Validate::uri() (Torsten Roehr) - Fixed optional arguments in Validate::number() (Torsten Roehr) 0.3.0 0.3.0 alpha alpha 2003-12-05 New BSD - Added Finance Validations for Financial related datas (S. Neufeind, Piotr Klaban) - Add polish validation (Piotr Klaban) - Add German validation (Stefan Neufeind) - Add EAN-UCC validtatio (see http://www.ean-ucc.org) (Piotr Klaban) - Add International Standard Serial Number (ISSN) and Music Number(ISMN) (Piotr Klaban, David Grant) - Drop Validate::url() in preferenc of Validate::uri() which is fully RFC2396 compliant - Move to PHP 3.0 license 0.2.0 0.2.0 alpha alpha 2003-06-15 New BSD - Add some dutch validations 0.1.1 0.1.1 alpha alpha 2003-03-12 New BSD - Validate::date(); argument parsing fixed