| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | declare(strict_types = 1); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Validation class | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |  * Copyright (c) 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox, Amir Saied | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |  * This source file is subject to the New BSD license, That is bundled | 
					
						
							|  |  |  |  * with this package in the file LICENSE, and is available through | 
					
						
							|  |  |  |  * the world-wide-web at | 
					
						
							|  |  |  |  * http://www.opensource.org/licenses/bsd-license.php | 
					
						
							|  |  |  |  * If you did not receive a copy of the new BSDlicense and are unable | 
					
						
							|  |  |  |  * to obtain it through the world-wide-web, please send a note to | 
					
						
							|  |  |  |  * pajoye@php.net so we can mail you a copy immediately. | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |  * Author: Tomas V.V.Cox  <cox@idecnet.com> | 
					
						
							|  |  |  |  *         Pierre-Alain Joye <pajoye@php.net> | 
					
						
							|  |  |  |  *         Amir Mohammad Saied <amir@php.net> | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * @author     Tomas V.V.Cox <cox@idecnet.com> | 
					
						
							|  |  |  |  * @author     Pierre-Alain Joye <pajoye@php.net> | 
					
						
							|  |  |  |  * @author     Amir Mohammad Saied <amir@php.net> | 
					
						
							|  |  |  |  * @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 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |  * @version    CVS: $Id$ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @see       http://pear.php.net/package/Validate | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  | // {{{ Constants
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Methods for common data validations | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  | \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); | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  | // }}}
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * @author    Tomas V.V.Cox <cox@idecnet.com> | 
					
						
							|  |  |  |  * @author    Pierre-Alain Joye <pajoye@php.net> | 
					
						
							|  |  |  |  * @author    Amir Mohammad Saied <amir@php.net> | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |  * @author    Diogo Cordeiro <diogo@fc.up.pt> | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * @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 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  * @version   Release: @package_version@ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @see      http://pear.php.net/package/Validate | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | class Validate | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |     // {{{ International, Generic and Country code TLDs
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * International Top-Level Domain | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This is an array of the known international | 
					
						
							|  |  |  |      * top-level domain names. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |      * @var array $itld (International top-level domains) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     protected static array $itld = [ | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         'arpa', | 
					
						
							|  |  |  |         'root', | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Generic top-level domain | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This is an array of the official | 
					
						
							|  |  |  |      * generic top-level domains. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |      * @var array $gtld (Generic top-level domains) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     protected static array $gtld = [ | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         'aero', | 
					
						
							|  |  |  |         'biz', | 
					
						
							|  |  |  |         'cat', | 
					
						
							|  |  |  |         'com', | 
					
						
							|  |  |  |         'coop', | 
					
						
							|  |  |  |         'edu', | 
					
						
							|  |  |  |         'gov', | 
					
						
							|  |  |  |         'info', | 
					
						
							|  |  |  |         'int', | 
					
						
							|  |  |  |         'jobs', | 
					
						
							|  |  |  |         'mil', | 
					
						
							|  |  |  |         'mobi', | 
					
						
							|  |  |  |         'museum', | 
					
						
							|  |  |  |         'name', | 
					
						
							|  |  |  |         'net', | 
					
						
							|  |  |  |         'org', | 
					
						
							|  |  |  |         'pro', | 
					
						
							|  |  |  |         'travel', | 
					
						
							|  |  |  |         'asia', | 
					
						
							|  |  |  |         'post', | 
					
						
							|  |  |  |         'tel', | 
					
						
							|  |  |  |         'geo', | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Country code top-level domains | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This is an array of the official country | 
					
						
							|  |  |  |      * codes top-level domains | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |      * @var array $cctld (Country Code Top-Level Domain) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     protected static array $cctld = [ | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         'ac', | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         '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', | 
					
						
							|  |  |  |     ]; | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |     // }}}
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Validate a tag URI (RFC4151) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $uri tag URI to validate | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @throws Exception | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool true if valid tag URI, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     private static function uriRFC4151(string $uri): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $datevalid = false; | 
					
						
							|  |  |  |         if (preg_match( | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             '/^tag:(?<name>.*),(?<date>\d{4}-?\d{0,2}-?\d{0,2}):(?<specific>.*)(.*:)*$/', | 
					
						
							|  |  |  |             $uri, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $matches, | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         )) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $date  = $matches['date']; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $date6 = strtotime($date); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             if ((mb_strlen($date) == 4) && $date <= date('Y')) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $datevalid = true; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             } elseif ((mb_strlen($date) == 7) && ($date6 < strtotime('now'))) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $datevalid = true; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             } elseif ((mb_strlen($date) == 10) && ($date6 < strtotime('now'))) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $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 | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @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 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @return bool true if valid number, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |     public static function number(string $number, array $options = []): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $decimal = $dec_prec = $min = $max = null; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\is_array($options)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             extract($options); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $dec_prec  = $dec_prec ? "{1,{$dec_prec}}" : '+'; | 
					
						
							|  |  |  |         $dec_regex = $decimal ? "[{$decimal}][0-9]{$dec_prec}" : ''; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (!preg_match("|^[-+]?\\s*[0-9]+({$dec_regex})?\$|", $number)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($decimal != '.') { | 
					
						
							|  |  |  |             $number = strtr($number, $decimal, '.'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $number = (float) str_replace(' ', '', $number); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         if ($min !== null && $min > $number) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         return !($max !== null && $max < $number); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Converting a string to UTF-7 (RFC 2152) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $string string to be converted | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @return string converted string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     private static function stringToUtf7(string $string): string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $return = ''; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $utf7   = [ | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             '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', | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             '3', '4', '5', '6', '7', '8', '9', '+', ',', | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $state = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($string)) { | 
					
						
							|  |  |  |             $i = 0; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             while ($i <= mb_strlen($string)) { | 
					
						
							|  |  |  |                 $char = mb_substr($string, $i, 1); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 if ($state == 0) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                     if ((\ord($char) >= 0x7F) || (\ord($char) <= 0x1F)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                         if ($char) { | 
					
						
							|  |  |  |                             $return .= '&'; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         $state = 1; | 
					
						
							|  |  |  |                     } elseif ($char == '&') { | 
					
						
							|  |  |  |                         $return .= '&-'; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         $return .= $char; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 } elseif (($i == mb_strlen($string) | 
					
						
							|  |  |  |                     || !((\ord($char) >= 0x7F)) || (\ord($char) <= 0x1F))) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     if ($state != 1) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                         if (\ord($char) > 64) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                             $return .= ''; | 
					
						
							|  |  |  |                         } else { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                             $return .= $utf7[\ord($char)]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     $return .= '-'; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     $state = 0; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     switch ($state) { | 
					
						
							|  |  |  |                         case 1: | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                             $return .= $utf7[\ord($char) >> 2]; | 
					
						
							|  |  |  |                             $residue = (\ord($char) & 0x03) << 4; | 
					
						
							|  |  |  |                             $state   = 2; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                             break; | 
					
						
							|  |  |  |                         case 2: | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                             $return .= $utf7[$residue | (\ord($char) >> 4)]; | 
					
						
							|  |  |  |                             $residue = (\ord($char) & 0x0F) << 2; | 
					
						
							|  |  |  |                             $state   = 3; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                             break; | 
					
						
							|  |  |  |                         case 3: | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                             $return .= $utf7[$residue | (\ord($char) >> 6)]; | 
					
						
							|  |  |  |                             $return .= $utf7[\ord($char) & 0x3F]; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                             $state = 1; | 
					
						
							|  |  |  |                             break; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 ++$i; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             return $return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return ''; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Validate an email according to full RFC822 (inclusive human readable part) | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $email   email to validate, | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      *                        will return the address for optional dns validation | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param array  $options email() options | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @return bool true if valid email, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     private static function emailRFC822(string &$email, array &$options): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         static $address   = null; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         static $uncomment = null; | 
					
						
							|  |  |  |         if (!$address) { | 
					
						
							|  |  |  |             // atom        =  1*<any CHAR except specials, SPACE and CTLs>
 | 
					
						
							|  |  |  |             $atom = '[^][()<>@,;:\\".\s\000-\037\177-\377]+\s*'; | 
					
						
							|  |  |  |             // qtext       =  <any CHAR excepting <">,     ; => 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       =  <any CHAR excluding "[",     ; => 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
 | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             $phrase = $word . '+'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             // 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 . ')$/'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $uncomment | 
					
						
							|  |  |  |                 = '/((?:(?:\\\\"|[^("])*(?:' . $quoted_string | 
					
						
							|  |  |  |                 . ')?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/'; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         // strip comments
 | 
					
						
							|  |  |  |         $email = preg_replace($uncomment, '$1 ', $email); | 
					
						
							|  |  |  |         return preg_match($address, $email); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Full TLD Validation function
 | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This function is used to make a much more proficient validation | 
					
						
							|  |  |  |      * against all types of official domain names. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $email   the email address to check | 
					
						
							|  |  |  |      * @param array  $options The options for validation | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool True if validating succeeds | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     protected static function fullTLDValidation( | 
					
						
							|  |  |  |         string $email, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         array $options, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): bool { | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         $validate = []; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (!empty($options['VALIDATE_ITLD_EMAILS'])) { | 
					
						
							|  |  |  |             $validate[] = 'itld'; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (!empty($options['VALIDATE_GTLD_EMAILS'])) { | 
					
						
							|  |  |  |             $validate[] = 'gtld'; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (!empty($options['VALIDATE_CCTLD_EMAILS'])) { | 
					
						
							|  |  |  |             $validate[] = 'cctld'; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\count($validate) === 0) { | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |             array_push($validate, 'itld', 'gtld', 'cctld'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         $toValidate = []; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($validate as $valid) { | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |             $tmpVar = (string) $valid; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $toValidate[$valid] = self::${$tmpVar}; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         $e = self::executeFullEmailValidation($email, $toValidate); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $e; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Execute the validation | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This function will execute the full email vs tld | 
					
						
							|  |  |  |      * validation using an array of tlds passed to it. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $email       the email to validate | 
					
						
							|  |  |  |      * @param array  $arrayOfTLDs The array of the TLDs to validate | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @return bool true or false (Depending on if it validates or if it does not) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     public static function executeFullEmailValidation( | 
					
						
							|  |  |  |         string $email, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         array $arrayOfTLDs, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): bool { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         $emailEnding = explode('.', $email); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $emailEnding = $emailEnding[\count($emailEnding) - 1]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         foreach ($arrayOfTLDs as $validator => $keys) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             if (\in_array($emailEnding, $keys)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Validate an email | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @param string $email email to validate | 
					
						
							| 
									
										
										
										
											2019-08-07 01:31:09 +01:00
										 |  |  |      * @param mixed bool (BC) $check_domain Check or not if the domain exists | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      *              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. | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      *  $options = [ | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      *      'check_domain' => 'true', | 
					
						
							|  |  |  |      *      'fullTLDValidation' => 'true', | 
					
						
							|  |  |  |      *      'use_rfc822' => 'true', | 
					
						
							|  |  |  |      *      'VALIDATE_GTLD_EMAILS' => 'true', | 
					
						
							|  |  |  |      *      'VALIDATE_CCTLD_EMAILS' => 'true', | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |      *      'VALIDATE_ITLD_EMAILS' => 'true', | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      *      ]; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param null|mixed $options | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @throws Exception | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool true if valid email, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     public static function email(string $email, $options = null): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $check_domain = false; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $use_rfc822   = false; | 
					
						
							|  |  |  |         if (\is_bool($options)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $check_domain = $options; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         } elseif (\is_array($options)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             extract($options); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * Check for IDN usage so we can encode the domain as Punycode | 
					
						
							|  |  |  |          * before continuing. | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         $hasIDNA = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         if (self::includePathFileExists('Net/IDNA2.php')) { | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             include_once('Net/IDNA2.php'); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $hasIDNA = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($hasIDNA === true) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             if (str_contains($email, '@')) { | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |                 $tmpEmail = explode('@', $email); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $domain   = array_pop($tmpEmail); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |                 // Check if the domain contains characters > 127 which means
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 // it's an idn domain name.
 | 
					
						
							|  |  |  |                 $chars = count_chars($domain, 1); | 
					
						
							|  |  |  |                 if (!empty($chars) && max(array_keys($chars)) > 127) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                     $idna   = &Net_IDNA2::singleton(); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     $domain = $idna->encode($domain); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $tmpEmail[] = $domain; | 
					
						
							|  |  |  |                 $email      = implode('@', $tmpEmail); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * @todo Fix bug here.. even if it passes this, it won't be passing | 
					
						
							|  |  |  |          *       The regular expression below | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         if (isset($fullTLDValidation)) { | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |             //$valid = self::fullTLDValidation($email, $fullTLDValidation);
 | 
					
						
							|  |  |  |             $valid = self::fullTLDValidation($email, $options); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             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
 | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |          \.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |          $&xi'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //checks if exists the domain (MX or A)
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if ($use_rfc822 ? self::emailRFC822($email, $options) | 
					
						
							|  |  |  |             : preg_match($regex, $email)) { | 
					
						
							|  |  |  |             if ($check_domain && \function_exists('checkdnsrr')) { | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |                 $domain = preg_replace('/[^-a-z.0-9]/i', '', array_pop(explode('@', $email))); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 return (bool) (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Validate a string using the given format 'format' | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string       $string  String to validate | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @param array|string $options Options array where: | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      *                              'format' is the format of the string | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      *                              Ex:VALIDATE_NUM . VALIDATE_ALPHA (see constants) | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      *                              'min_length' minimum length | 
					
						
							|  |  |  |      *                              'max_length' maximum length | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @return bool true if valid string, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     public static function string(string $string, $options): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $format     = null; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         $min_length = 0; | 
					
						
							|  |  |  |         $max_length = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\is_array($options)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             extract($options); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if ($format && !preg_match("|^[{$format}]*\$|s", $string)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if ($min_length && mb_strlen($string) < $min_length) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         return !($max_length && mb_strlen($string) > $max_length); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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: | 
					
						
							|  |  |  |      * <code> | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * $options = ['allowed_schemes' => ['http', 'https', 'ftp']] | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * var_dump(Validate::uri('http://www.example.org', $options)); | 
					
						
							|  |  |  |      * </code> | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * 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'" | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string     $url     URI to validate | 
					
						
							|  |  |  |      * @param null|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 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @throws Exception | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool true if valid uri, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     public static function uri(string $url, ?array $options = null): bool | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $strict          = ';/?:@$,'; | 
					
						
							|  |  |  |         $domain_check    = false; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         $allowed_schemes = null; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\is_array($options)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             extract($options); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\is_array($allowed_schemes) | 
					
						
							|  |  |  |             && \in_array('tag', $allowed_schemes) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             if (str_starts_with($url, 'tag:')) { | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |                 return self::uriRFC4151($url); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (preg_match( | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             '&^(?:([a-z][-+.a-z0-9]*):)?                             # 1. scheme
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |               (?://                                                   # 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
 | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |               $&xi', | 
					
						
							|  |  |  |             $url, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $matches, | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         )) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $scheme    = $matches[1] ?? ''; | 
					
						
							|  |  |  |             $authority = $matches[3] ?? ''; | 
					
						
							|  |  |  |             if (\is_array($allowed_schemes) | 
					
						
							|  |  |  |                 && !\in_array($scheme, $allowed_schemes) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             ) { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (!empty($matches[4])) { | 
					
						
							|  |  |  |                 $parts = explode('.', $matches[4]); | 
					
						
							|  |  |  |                 foreach ($parts as $part) { | 
					
						
							|  |  |  |                     if ($part > 255) { | 
					
						
							|  |  |  |                         return false; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             } elseif ($domain_check && \function_exists('checkdnsrr')) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 if (!checkdnsrr($authority, 'A')) { | 
					
						
							|  |  |  |                     return false; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if ($strict) { | 
					
						
							|  |  |  |                 $strict = '#[' . preg_quote($strict, '#') . ']#'; | 
					
						
							|  |  |  |                 if ((!empty($matches[7]) && preg_match($strict, $matches[7])) | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     || (!empty($matches[8]) && preg_match($strict, $matches[8]))) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     return false; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Substr | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2022-01-30 16:41:54 +00:00
										 |  |  |      * @param string       $num Length | 
					
						
							|  |  |  |      * @param false|string $opt Unknown | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     private static function substr( | 
					
						
							|  |  |  |         string &$date, | 
					
						
							|  |  |  |         string $num, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $opt = false, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): string { | 
					
						
							|  |  |  |         if ( | 
					
						
							|  |  |  |             $opt | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             && mb_strlen($date) >= $opt | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |             && preg_match('/^[0-9]{' . $opt . '}/', $date, $m) | 
					
						
							|  |  |  |         ) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $ret = $m[0]; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $ret = mb_substr($date, 0, $num); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $date = mb_substr($date, mb_strlen($ret)); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         return $ret; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     protected static function modf($val, $div) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (\function_exists('bcmod')) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return bcmod($val, $div); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         } elseif (\function_exists('fmod')) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return fmod($val, $div); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $r = $val / $div; | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $i = (int) $r; | 
					
						
							|  |  |  |         return (int) ($val - $i * $div + .1); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Calculates sum of product of number digits with weights | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $number  number string | 
					
						
							|  |  |  |      * @param array  $weights reference to array of weights | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return int returns product of number digits with weights | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     protected static function multWeights( | 
					
						
							|  |  |  |         string $number, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         array &$weights, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): int { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         if (!\is_array($weights)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $sum = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $count = min(\count($weights), mb_strlen($number)); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         if ($count == 0) { // empty string or weights array
 | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         for ($i = 0; $i < $count; ++$i) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $sum += (int) (mb_substr($number, $i, 1)) * $weights[$i]; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $sum; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Calculates control digit for a given number | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @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 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @return int -1 calculated control number is returned | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     protected static function getControlNumber( | 
					
						
							|  |  |  |         string $number, | 
					
						
							|  |  |  |         array &$weights, | 
					
						
							|  |  |  |         int $modulo = 10, | 
					
						
							|  |  |  |         int $subtract = 0, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         bool $allow_high = false, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): int { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         // calc sum
 | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         $sum = self::multWeights($number, $weights); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |         if ($sum == -1) { | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         $mod = self::modf($sum, $modulo);  // calculate control digit
 | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($subtract > $mod && $mod > 0) { | 
					
						
							|  |  |  |             $mod = $subtract - $mod; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($allow_high === false) { | 
					
						
							|  |  |  |             $mod %= 10;           // change 10 to zero
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $mod; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Validates a number | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param string $number   number to validate | 
					
						
							|  |  |  |      * @param array  $weights  reference to array of weights | 
					
						
							|  |  |  |      * @param int    $modulo   (optional) number | 
					
						
							|  |  |  |      * @param int    $subtract (optional) number | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @return bool true if valid, false if not | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     protected static function checkControlNumber( | 
					
						
							|  |  |  |         string $number, | 
					
						
							|  |  |  |         array &$weights, | 
					
						
							|  |  |  |         int $modulo = 10, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         int $subtract = 0, | 
					
						
							|  |  |  |     ): bool { | 
					
						
							|  |  |  |         if (mb_strlen($number) < \count($weights)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $target_digit  = mb_substr($number, \count($weights), 1); | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         $control_digit = self::getControlNumber( | 
					
						
							|  |  |  |             $number, | 
					
						
							|  |  |  |             $weights, | 
					
						
							|  |  |  |             $modulo, | 
					
						
							|  |  |  |             $subtract, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             ($modulo > 10), | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($control_digit == -1) { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($target_digit === 'X' && $control_digit == 10) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         return !($control_digit != $target_digit); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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 | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @param array $data     Ex: ['name' => 'toto', 'email' => 'toto@thing.info']; | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |      * @param array $val_type Contains the validation type and all parameters used in. | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      *                        'val_type' is not optional | 
					
						
							|  |  |  |      *                        others validations properties must have the same name as the function
 | 
					
						
							|  |  |  |      *                        parameters. | 
					
						
							|  |  |  |      *                        Ex: ['toto' => ['type'=>'string','format'='toto@thing.info','min_length'=>5]]; | 
					
						
							|  |  |  |      * @param bool  $remove   if set, the elements not listed in data will be removed | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |      * @return array value name => true|false    the value name comes from the data key | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     public static function multiple( | 
					
						
							|  |  |  |         array &$data, | 
					
						
							|  |  |  |         array &$val_type, | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         bool $remove = false, | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     ): array { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $keys  = array_keys($data); | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         $valid = []; | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach ($keys as $var_name) { | 
					
						
							|  |  |  |             if (!isset($val_type[$var_name])) { | 
					
						
							|  |  |  |                 if ($remove) { | 
					
						
							|  |  |  |                     unset($data[$var_name]); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $opt       = $val_type[$var_name]; | 
					
						
							|  |  |  |             $methods   = get_class_methods('Validate'); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             $val2check = $data[$var_name]; | 
					
						
							|  |  |  |             // core validation method
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             if (\in_array(mb_strtolower($opt['type']), $methods)) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 //$opt[$opt['type']] = $data[$var_name];
 | 
					
						
							|  |  |  |                 $method = $opt['type']; | 
					
						
							|  |  |  |                 unset($opt['type']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 if (sizeof($opt) == 1 && \is_array(reset($opt))) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     $opt = array_pop($opt); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $valid[$var_name] = \call_user_func(['Validate', $method], $val2check, $opt); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             /** | 
					
						
							|  |  |  |              * external validation method in the form: | 
					
						
							|  |  |  |              * "<class name><underscore><method name>" | 
					
						
							|  |  |  |              * Ex: us_ssn will include class Validate/US.php and call method ssn() | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             } elseif (str_contains($opt['type'], '_')) { | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 $validateType = explode('_', $opt['type']); | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $method       = array_pop($validateType); | 
					
						
							|  |  |  |                 $class        = implode('_', $validateType); | 
					
						
							|  |  |  |                 $classPath    = str_replace('_', \DIRECTORY_SEPARATOR, $class); | 
					
						
							|  |  |  |                 $class        = 'Validate_' . $class; | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |                 if (self::includePathFileExists("Validate/{$classPath}.php")) { | 
					
						
							|  |  |  |                     include_once "Validate/{$classPath}.php"; | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                     trigger_error("{$class} isn't installed or you may have some permission issues", \E_USER_ERROR); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $ce = mb_substr(phpversion(), 0, 1) > 4 | 
					
						
							|  |  |  |                     ? class_exists($class, false) : class_exists($class); | 
					
						
							|  |  |  |                 if (!$ce | 
					
						
							|  |  |  |                     || !\in_array($method, get_class_methods($class)) | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                 ) { | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     trigger_error( | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                         "Invalid validation type {$class}::{$method}", | 
					
						
							|  |  |  |                         \E_USER_WARNING, | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 unset($opt['type']); | 
					
						
							|  |  |  |                 if (sizeof($opt) == 1) { | 
					
						
							|  |  |  |                     $opt = array_pop($opt); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                 $valid[$var_name] = \call_user_func( | 
					
						
							|  |  |  |                     [$class, $method], | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                     $data[$var_name], | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                     $opt, | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                 trigger_error( | 
					
						
							|  |  |  |                     "Invalid validation type {$opt['type']}", | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |                     \E_USER_WARNING, | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $valid; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Determine whether specified file exists along the include path. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $filename file to search for | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return bool true if file exists | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-08-12 12:08:54 +03:00
										 |  |  |     private static function includePathFileExists(string $filename): bool | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |         $paths  = explode(':', ini_get('include_path')); | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |         $result = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |         foreach ($paths as $val) { | 
					
						
							| 
									
										
										
										
											2021-10-10 09:26:18 +01:00
										 |  |  |             $result = file_exists($val . '/' . $filename); | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  |             if ($result) { | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-07-07 23:34:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-25 20:13:27 +02:00
										 |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-03 21:29:06 +00:00
										 |  |  | } |