class_mcValidator.inc.php 6.28 KB
<?php
/** 
 * @copyright (c) 2014, netz.coop eG
 */
/**
 *	@filesource 	class_mcValidator.inc.php
 *
 * @category losp
 * @copyright Copyright by mensch.coop e.G. 2011
 * @mailto	dev [at] mensch.coop
 * @link http://mensch.coop
 */
class mcValidator {
	const VALIDATOR_TYPE_EMAIL = 'email';
	const VALIDATOR_TYPE_URL = 'url';
	const VALIDATOR_TYPE_SINGELTONNAME = 'singeltonName';
	const VALIDATOR_TYPE_PHONE = 'phone';
	const VALIDATOR_TYPE_GERPLZ = 'gerPlz';
	const VALIDATOR_TYPE_YOUTUBEID = 'youtubeID';
	const VALIDATOR_TYPE_VIMEOID = 'vimeoID';
	const VALIDATOR_TYPE_PASSWORD = 'password';
	
	
	private static $regExpArray = array(
		self::VALIDATOR_TYPE_URL => array(
			'regExp' => '(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?',
			'match' => true
		),
		self::VALIDATOR_TYPE_SINGELTONNAME => array(
			'regExp' => '[^A-Za-z0-9\-]',
			'match' => false
		),
		self::VALIDATOR_TYPE_PHONE => array(
			'regExp' => '[^-\s\d.\(\)\/+]',
			'match' => false
		),
		self::VALIDATOR_TYPE_GERPLZ => array(
			'regExp' => '\d{5}$',
			'match' => true
		),
		self::VALIDATOR_TYPE_YOUTUBEID => array(
			'regExp' => '[^A-Za-z0-9\-\_]',
			'match' => false
		),
		self::VALIDATOR_TYPE_VIMEOID => array(
			'regExp' => '[\D]',
			'match' => false
		),
		self::VALIDATOR_TYPE_PASSWORD => array(
			'regExp' => '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}',
			'match' => true
		)
			
	);
	
	public static function getRegExp($param_type){
		if(array_key_exists($param_type,self::$regExpArray)){
			return self::$regExpArray[$param_type];
		}else{
			return null;
		}
	}
	/**
	 * Attention: function only checks value exists if $param_type is not const of VALIDATOR_TYPE_*
	 *  
	 * @param String $param_value
	 * @param String $param_type - the regexpression-type which should be used
	 * @param boolean $param_allowNoValue - default false, allow blank value
	 * @param boolean $param_utf8 - default true, $param_value format is utf8
	 * 
	 * @return boolean
	 */
	public static function checkValue($param_value, $param_type, $param_allowNoValue = false, $param_utf8 = true){
		if($param_type == self::VALIDATOR_TYPE_EMAIL){
			return self::checkEmail($param_value, $param_allowNoValue);
		}
		
		$var_value = trim($param_value);
		
		if(!isset($var_value) || is_null($var_value) || empty($var_value) || $var_value === '') {
            return $param_allowNoValue;
        }
        else{
        	$var_regExp = '';
        	$var_match = true;
        	
        	if($param_type){
        		switch($param_type){
        			case  self::VALIDATOR_TYPE_EMAIL : return self::checkEmail($param_value, $param_allowNoValue);
        			default : 
        				if(array_key_exists($param_type,self::$regExpArray)){
        					$var_regExp = '/'+self::$regExpArray[$param_type]['regExp']+'/';
        					$var_match = self::$regExpArray[$param_type]['match'];
        				}
        				else{
        					return true;
        				}
        				break;
        		}
        	}
        	
        	if($param_utf8){
        		$var_regExp +='u';
        	}
        	
        	$tmp_return = preg_match($param_value,$var_regExp);
        	if(!$var_match){
        		return !$tmp_return;
        	}else{
        		return $tmp_return;
        	}
        	
        }
		return true;
	}
	
	/**
	 * checks if a String is a valid email address
	 *
	 * @param $param_email
	 * @param boolean $param_allowNoValue - default false, allow blank value
	 * @return boolean
	 */
	public static function checkEmail($param_email,$param_allowNoValue = false) {

		function valid_dot_pos($email) {
            $str_len = strlen($email);
            for($i=0; $i<$str_len; $i++) {
                $current_element = $email[$i];
                if($current_element == "." && ($email[$i+1] == ".")) {
                    return false;
                    break;
                }
                else {

                }
            }
            return true;
        }
		function valid_local_part($local_part) {
            if(preg_match("/[^a-zA-Z0-9-_ß@.!#$%&'*\/+=?^`{\|}~]/",$local_part)) {
                return false;
            }
            else {
                return true;
            }
        }
        function valid_domain_part($domain_part) {
            if(preg_match("/[^a-zA-Z0-9-_ß@#\[\].]/", $domain_part)) {
                return false;
            }

            elseif(preg_match("/[@]/", $domain_part) && preg_match("/[#]/", $domain_part)) {
                return false;
            }
            elseif(preg_match("/[\[]/", $domain_part) || preg_match("/[\]]/", $domain_part)) {
                $dot_pos = strrpos($domain_part, ".");
                if(($dot_pos < strrpos($domain_part, "]")) || (strrpos($domain_part, "]") < strrpos($domain_part, "["))) {
                    return true;
                }
                elseif(preg_match("/[^0-9.]/", $domain_part)) {
                    return false;
                }
                else {
                    return false;
                }
            }
            else {
                return true;
            }
        }
        // trim() the entered E-Mail
        $str_trimmed = trim($param_email);
        // find the @ position
        $at_pos = strrpos($str_trimmed, "@");
        // find the . position
        $dot_pos = strrpos($str_trimmed, ".");
        // this will cut the local part and return it in $local_part
        $local_part = substr($str_trimmed, 0, $at_pos);
        // this will cut the domain part and return it in $domain_part
        $domain_part = substr($str_trimmed, $at_pos);

		if(!isset($str_trimmed) || is_null($str_trimmed) || empty($str_trimmed) || $str_trimmed == "") {
            return $param_allowNoValue;
        }
        elseif(!valid_local_part($local_part)) {            
            return false;
        }
        elseif(!valid_domain_part($domain_part)) {            
            return false;
        }
        elseif($at_pos > $dot_pos) {            
            return false;
        }
        elseif(!valid_local_part($local_part)) {            
            return false;
        }
        elseif(($str_trimmed[$at_pos + 1]) == ".") {            
            return false;
        }
        elseif(!preg_match("/[(@)]/", $str_trimmed) || !preg_match("/[(.)]/", $str_trimmed)) {            
            return false;
        }
        else {            
            return true;
        }
	}
}
?>