<?php/*** CodeIgniter** An open source application development framework for PHP** This content is released under the MIT License (MIT)** Copyright (c) 2014 - 2015, British Columbia Institute of Technology** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.** @package CodeIgniter* @author EllisLab Dev Team* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)* @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)* @license http://opensource.org/licenses/MIT MIT License* @link http://codeigniter.com* @since Version 1.0.0* @filesource*/defined('BASEPATH') OR exit('No direct script access allowed');/*** Form Validation Class** @package CodeIgniter* @subpackage Libraries* @category Validation* @author EllisLab Dev Team* @link http://codeigniter.com/user_guide/libraries/form_validation.html*/class CI_Form_validation {/*** Reference to the CodeIgniter instance** @var object*/protected $CI;/*** Validation data for the current form submission** @var array*/protected $_field_data = array();/*** Validation rules for the current form** @var array*/protected $_config_rules = array();/*** Array of validation errors** @var array*/protected $_error_array = array();/*** Array of custom error messages** @var array*/protected $_error_messages = array();/*** Start tag for error wrapping** @var string*/protected $_error_prefix = '<p>';/*** End tag for error wrapping** @var string*/protected $_error_suffix = '</p>';/*** Custom error message** @var string*/protected $error_string = '';/*** Whether the form data has been validated as safe** @var bool*/protected $_safe_form_data = FALSE;/*** Custom data to validate** @var array*/public $validation_data = array();/*** Initialize Form_Validation class** @param array $rules* @return void*/public function __construct($rules = array()){$this->CI =& get_instance();// applies delimiters set in config file.if (isset($rules['error_prefix'])){$this->_error_prefix = $rules['error_prefix'];unset($rules['error_prefix']);}if (isset($rules['error_suffix'])){$this->_error_suffix = $rules['error_suffix'];unset($rules['error_suffix']);}// Validation rules can be stored in a config file.$this->_config_rules = $rules;// Automatically load the form helper$this->CI->load->helper('form');log_message('info', 'Form Validation Class Initialized');}// --------------------------------------------------------------------/*** Set Rules** This function takes an array of field names and validation* rules as input, any custom error messages, validates the info,* and stores it** @param mixed $field* @param string $label* @param mixed $rules* @param array $errors* @return CI_Form_validation*/public function set_rules($field, $label = '', $rules = array(), $errors = array()){// No reason to set rules if we have no POST data// or a validation array has not been specifiedif ($this->CI->input->method() !== 'post' && empty($this->validation_data)){return $this;}// If an array was passed via the first parameter instead of individual string// values we cycle through it and recursively call this function.if (is_array($field)){foreach ($field as $row){// Houston, we have a problem...if ( ! isset($row['field'], $row['rules'])){continue;}// If the field label wasn't passed we use the field name$label = isset($row['label']) ? $row['label'] : $row['field'];// Add the custom error message array$errors = (isset($row['errors']) && is_array($row['errors'])) ? $row['errors'] : array();// Here we go!$this->set_rules($row['field'], $label, $row['rules'], $errors);}return $this;}// No fields or no rules? Nothing to do...if ( ! is_string($field) OR $field === '' OR empty($rules)){return $this;}elseif ( ! is_array($rules)){// BC: Convert pipe-separated rules string to an arrayif ( ! is_string($rules)){return $this;}$rules = explode('|', $rules);}// If the field label wasn't passed we use the field name$label = ($label === '') ? $field : $label;$indexes = array();// Is the field name an array? If it is an array, we break it apart// into its components so that we can fetch the corresponding POST data laterif (($is_array = (bool) preg_match_all('/\[(.*?)\]/', $field, $matches)) === TRUE){sscanf($field, '%[^[][', $indexes[0]);for ($i = 0, $c = count($matches[0]); $i < $c; $i++){if ($matches[1][$i] !== ''){$indexes[] = $matches[1][$i];}}}// Build our master array$this->_field_data[$field] = array('field' => $field,'label' => $label,'rules' => $rules,'errors' => $errors,'is_array' => $is_array,'keys' => $indexes,'postdata' => NULL,'error' => '');return $this;}// --------------------------------------------------------------------/*** By default, form validation uses the $_POST array to validate** If an array is set through this method, then this array will* be used instead of the $_POST array** Note that if you are validating multiple arrays, then the* reset_validation() function should be called after validating* each array due to the limitations of CI's singleton** @param array $data* @return CI_Form_validation*/public function set_data(array $data){if ( ! empty($data)){$this->validation_data = $data;}return $this;}// --------------------------------------------------------------------/*** Set Error Message** Lets users set their own error messages on the fly. Note:* The key name has to match the function name that it corresponds to.** @param array* @param string* @return CI_Form_validation*/public function set_message($lang, $val = ''){if ( ! is_array($lang)){$lang = array($lang => $val);}$this->_error_messages = array_merge($this->_error_messages, $lang);return $this;}// --------------------------------------------------------------------/*** Set The Error Delimiter** Permits a prefix/suffix to be added to each error message** @param string* @param string* @return CI_Form_validation*/public function set_error_delimiters($prefix = '<p>', $suffix = '</p>'){$this->_error_prefix = $prefix;$this->_error_suffix = $suffix;return $this;}// --------------------------------------------------------------------/*** Get Error Message** Gets the error message associated with a particular field** @param string $field Field name* @param string $prefix HTML start tag* @param string $suffix HTML end tag* @return string*/public function error($field, $prefix = '', $suffix = ''){if (empty($this->_field_data[$field]['error'])){return '';}if ($prefix === ''){$prefix = $this->_error_prefix;}if ($suffix === ''){$suffix = $this->_error_suffix;}return $prefix.$this->_field_data[$field]['error'].$suffix;}// --------------------------------------------------------------------/*** Get Array of Error Messages** Returns the error messages as an array** @return array*/public function error_array(){return $this->_error_array;}// --------------------------------------------------------------------/*** Error String** Returns the error messages as a string, wrapped in the error delimiters** @param string* @param string* @return string*/public function error_string($prefix = '', $suffix = ''){// No errors, validation passes!if (count($this->_error_array) === 0){return '';}if ($prefix === ''){$prefix = $this->_error_prefix;}if ($suffix === ''){$suffix = $this->_error_suffix;}// Generate the error string$str = '';foreach ($this->_error_array as $val){if ($val !== ''){$str .= $prefix.$val.$suffix."\n";}}return $str;}// --------------------------------------------------------------------/*** Run the Validator** This function does all the work.** @param string $group* @return bool*/public function run($group = ''){// Do we even have any data to process? Mm?$validation_array = empty($this->validation_data) ? $_POST : $this->validation_data;if (count($validation_array) === 0){return FALSE;}// Does the _field_data array containing the validation rules exist?// If not, we look to see if they were assigned via a config fileif (count($this->_field_data) === 0){// No validation rules? We're done...if (count($this->_config_rules) === 0){return FALSE;}if (empty($group)){// Is there a validation rule for the particular URI being accessed?$group = trim($this->CI->uri->ruri_string(), '/');isset($this->_config_rules[$group]) OR $group = $this->CI->router->class.'/'.$this->CI->router->method;}$this->set_rules(isset($this->_config_rules[$group]) ? $this->_config_rules[$group] : $this->_config_rules);// Were we able to set the rules correctly?if (count($this->_field_data) === 0){log_message('debug', 'Unable to find validation rules');return FALSE;}}// Load the language file containing error messages$this->CI->lang->load('form_validation');// Cycle through the rules for each field and match the corresponding $validation_data itemforeach ($this->_field_data as $field => $row){// Fetch the data from the validation_data array item and cache it in the _field_data array.// Depending on whether the field name is an array or a string will determine where we get it from.if ($row['is_array'] === TRUE){$this->_field_data[$field]['postdata'] = $this->_reduce_array($validation_array, $row['keys']);}elseif (isset($validation_array[$field])){$this->_field_data[$field]['postdata'] = $validation_array[$field];}}// Execute validation rules// Note: A second foreach (for now) is required in order to avoid false-positives// for rules like 'matches', which correlate to other validation fields.foreach ($this->_field_data as $field => $row){// Don't try to validate if we have no rules setif (empty($row['rules'])){continue;}$this->_execute($row, $row['rules'], $this->_field_data[$field]['postdata']);}// Did we end up with any errors?$total_errors = count($this->_error_array);if ($total_errors > 0){$this->_safe_form_data = TRUE;}// Now we need to re-set the POST data with the new, processed data$this->_reset_post_array();return ($total_errors === 0);}// --------------------------------------------------------------------/*** Traverse a multidimensional $_POST array index until the data is found** @param array* @param array* @param int* @return mixed*/protected function _reduce_array($array, $keys, $i = 0){if (is_array($array) && isset($keys[$i])){return isset($array[$keys[$i]]) ? $this->_reduce_array($array[$keys[$i]], $keys, ($i+1)) : NULL;}// NULL must be returned for empty fieldsreturn ($array === '') ? NULL : $array;}// --------------------------------------------------------------------/*** Re-populate the _POST array with our finalized and processed data** @return void*/protected function _reset_post_array(){foreach ($this->_field_data as $field => $row){if ($row['postdata'] !== NULL){if ($row['is_array'] === FALSE){if (isset($_POST[$row['field']])){$_POST[$row['field']] = $row['postdata'];}}else{// start with a reference$post_ref =& $_POST;// before we assign values, make a reference to the right POST keyif (count($row['keys']) === 1){$post_ref =& $post_ref[current($row['keys'])];}else{foreach ($row['keys'] as $val){$post_ref =& $post_ref[$val];}}if (is_array($row['postdata'])){$array = array();foreach ($row['postdata'] as $k => $v){$array[$k] = $v;}$post_ref = $array;}else{$post_ref = $row['postdata'];}}}}}// --------------------------------------------------------------------/*** Executes the Validation routines** @param array* @param array* @param mixed* @param int* @return mixed*/protected function _execute($row, $rules, $postdata = NULL, $cycles = 0){// If the $_POST data is an array we will run a recursive callif (is_array($postdata)){foreach ($postdata as $key => $val){$this->_execute($row, $rules, $val, $key);}return;}// If the field is blank, but NOT required, no further tests are necessary$callback = FALSE;if ( ! in_array('required', $rules) && ($postdata === NULL OR $postdata === '')){// Before we bail out, does the rule contain a callback?foreach ($rules as &$rule){if (is_string($rule)){if (strncmp($rule, 'callback_', 9) === 0){$callback = TRUE;$rules = array(1 => $rule);break;}}elseif (is_callable($rule)){$callback = TRUE;$rules = array(1 => $rule);break;}elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])){$callback = TRUE;$rules = array($rule[0] => $rule[1]);break;}}if ( ! $callback){return;}}// Isset Test. Typically this rule will only apply to checkboxes.if (($postdata === NULL OR $postdata === '') && ! $callback){if (in_array('isset', $rules, TRUE) OR in_array('required', $rules)){// Set the message type$type = in_array('required', $rules) ? 'required' : 'isset';// Check if a custom message is definedif (isset($this->_field_data[$row['field']]['errors'][$type])){$line = $this->_field_data[$row['field']]['errors'][$type];}elseif (isset($this->_error_messages[$type])){$line = $this->_error_messages[$type];}elseif (FALSE === ($line = $this->CI->lang->line('form_validation_'.$type))// DEPRECATED support for non-prefixed keys&& FALSE === ($line = $this->CI->lang->line($type, FALSE))){$line = 'The field was not set';}// Build the error message$message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']));// Save the error message$this->_field_data[$row['field']]['error'] = $message;if ( ! isset($this->_error_array[$row['field']])){$this->_error_array[$row['field']] = $message;}}return;}// --------------------------------------------------------------------// Cycle through each rule and run itforeach ($rules as $rule){$_in_array = FALSE;// We set the $postdata variable with the current data in our master array so that// each cycle of the loop is dealing with the processed data from the last cycleif ($row['is_array'] === TRUE && is_array($this->_field_data[$row['field']]['postdata'])){// We shouldn't need this safety, but just in case there isn't an array index// associated with this cycle we'll bail outif ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles])){continue;}$postdata = $this->_field_data[$row['field']]['postdata'][$cycles];$_in_array = TRUE;}else{// If we get an array field, but it's not expected - then it is most likely// somebody messing with the form on the client side, so we'll just consider// it an empty field$postdata = is_array($this->_field_data[$row['field']]['postdata'])? NULL: $this->_field_data[$row['field']]['postdata'];}// Is the rule a callback?$callback = $callable = FALSE;if (is_string($rule)){if (strpos($rule, 'callback_') === 0){$rule = substr($rule, 9);$callback = TRUE;}}elseif (is_callable($rule)){$callable = TRUE;}elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1])){// We have a "named" callable, so save the name$callable = $rule[0];$rule = $rule[1];}// Strip the parameter (if exists) from the rule// Rules can contain a parameter: max_length[5]$param = FALSE;if ( ! $callable && preg_match('/(.*?)\[(.*)\]/', $rule, $match)){$rule = $match[1];$param = $match[2];}// Call the function that corresponds to the ruleif ($callback OR $callable !== FALSE){if ($callback){if ( ! method_exists($this->CI, $rule)){log_message('debug', 'Unable to find callback validation rule: '.$rule);$result = FALSE;}else{// Run the function and grab the result$result = $this->CI->$rule($postdata, $param);}}else{$result = is_array($rule)? $rule[0]->{$rule[1]}($postdata): $rule($postdata);// Is $callable set to a rule name?if ($callable !== FALSE){$rule = $callable;}}// Re-assign the result to the master data arrayif ($_in_array === TRUE){$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;}else{$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;}// If the field isn't required and we just processed a callback we'll move on...if ( ! in_array('required', $rules, TRUE) && $result !== FALSE){continue;}}elseif ( ! method_exists($this, $rule)){// If our own wrapper function doesn't exist we see if a native PHP function does.// Users can use any native PHP function call that has one param.if (function_exists($rule)){// Native PHP functions issue warnings if you pass them more parameters than they use$result = ($param !== FALSE) ? $rule($postdata, $param) : $rule($postdata);if ($_in_array === TRUE){$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;}else{$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;}}else{log_message('debug', 'Unable to find validation rule: '.$rule);$result = FALSE;}}else{$result = $this->$rule($postdata, $param);if ($_in_array === TRUE){$this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;}else{$this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;}}// Did the rule test negatively? If so, grab the error.if ($result === FALSE){// Callable rules might not have named error messagesif ( ! is_string($rule)){$line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)';}// Check if a custom message is definedelseif (isset($this->_field_data[$row['field']]['errors'][$rule])){$line = $this->_field_data[$row['field']]['errors'][$rule];}elseif ( ! isset($this->_error_messages[$rule])){if (FALSE === ($line = $this->CI->lang->line('form_validation_'.$rule))// DEPRECATED support for non-prefixed keys&& FALSE === ($line = $this->CI->lang->line($rule, FALSE))){$line = $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')';}}else{$line = $this->_error_messages[$rule];}// Is the parameter we are inserting into the error message the name// of another field? If so we need to grab its "field label"if (isset($this->_field_data[$param], $this->_field_data[$param]['label'])){$param = $this->_translate_fieldname($this->_field_data[$param]['label']);}// Build the error message$message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param);// Save the error message$this->_field_data[$row['field']]['error'] = $message;if ( ! isset($this->_error_array[$row['field']])){$this->_error_array[$row['field']] = $message;}return;}}}// --------------------------------------------------------------------/*** Translate a field name** @param string the field name* @return string*/protected function _translate_fieldname($fieldname){// Do we need to translate the field name? We look for the prefix 'lang:' to determine this// If we find one, but there's no translation for the string - just return itif (sscanf($fieldname, 'lang:%s', $line) === 1 && FALSE === ($fieldname = $this->CI->lang->line($line, FALSE))){return $line;}return $fieldname;}// --------------------------------------------------------------------/*** Build an error message using the field and param.** @param string The error message line* @param string A field's human name* @param mixed A rule's optional parameter* @return string*/protected function _build_error_msg($line, $field = '', $param = ''){// Check for %s in the string for legacy support.if (strpos($line, '%s') !== FALSE){return sprintf($line, $field, $param);}return str_replace(array('{field}', '{param}'), array($field, $param), $line);}// --------------------------------------------------------------------/*** Checks if the rule is present within the validator** Permits you to check if a rule is present within the validator** @param string the field name* @return bool*/public function has_rule($field){return isset($this->_field_data[$field]);}// --------------------------------------------------------------------/*** Get the value from a form** Permits you to repopulate a form field with the value it was submitted* with, or, if that value doesn't exist, with the default** @param string the field name* @param string* @return string*/public function set_value($field = '', $default = ''){if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])){return $default;}// If the data is an array output them one at a time.// E.g: form_input('name[]', set_value('name[]');if (is_array($this->_field_data[$field]['postdata'])){return array_shift($this->_field_data[$field]['postdata']);}return $this->_field_data[$field]['postdata'];}// --------------------------------------------------------------------/*** Set Select** Enables pull-down lists to be set to the value the user* selected in the event of an error** @param string* @param string* @param bool* @return string*/public function set_select($field = '', $value = '', $default = FALSE){if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])){return ($default === TRUE && count($this->_field_data) === 0) ? ' selected="selected"' : '';}$field = $this->_field_data[$field]['postdata'];$value = (string) $value;if (is_array($field)){// Note: in_array('', array(0)) returns TRUE, do not use itforeach ($field as &$v){if ($value === $v){return ' selected="selected"';}}return '';}elseif (($field === '' OR $value === '') OR ($field !== $value)){return '';}return ' selected="selected"';}// --------------------------------------------------------------------/*** Set Radio** Enables radio buttons to be set to the value the user* selected in the event of an error** @param string* @param string* @param bool* @return string*/public function set_radio($field = '', $value = '', $default = FALSE){if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])){return ($default === TRUE && count($this->_field_data) === 0) ? ' checked="checked"' : '';}$field = $this->_field_data[$field]['postdata'];$value = (string) $value;if (is_array($field)){// Note: in_array('', array(0)) returns TRUE, do not use itforeach ($field as &$v){if ($value === $v){return ' checked="checked"';}}return '';}elseif (($field === '' OR $value === '') OR ($field !== $value)){return '';}return ' checked="checked"';}// --------------------------------------------------------------------/*** Set Checkbox** Enables checkboxes to be set to the value the user* selected in the event of an error** @param string* @param string* @param bool* @return string*/public function set_checkbox($field = '', $value = '', $default = FALSE){// Logic is exactly the same as for radio fieldsreturn $this->set_radio($field, $value, $default);}// --------------------------------------------------------------------/*** Required** @param string* @return bool*/public function required($str){return is_array($str) ? (bool) count($str) : (trim($str) !== '');}// --------------------------------------------------------------------/*** Performs a Regular Expression match test.** @param string* @param string regex* @return bool*/public function regex_match($str, $regex){return (bool) preg_match($regex, $str);}// --------------------------------------------------------------------/*** Match one field to another** @param string $str string to compare against* @param string $field* @return bool*/public function matches($str, $field){return isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])? ($str === $this->_field_data[$field]['postdata']): FALSE;}// --------------------------------------------------------------------/*** Differs from another field** @param string* @param string field* @return bool*/public function differs($str, $field){return ! (isset($this->_field_data[$field]) && $this->_field_data[$field]['postdata'] === $str);}// --------------------------------------------------------------------/*** Is Unique** Check if the input value doesn't already exist* in the specified database field.** @param string $str* @param string $field* @return bool*/public function is_unique($str, $field){sscanf($field, '%[^.].%[^.]', $table, $field);return isset($this->CI->db)? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0): FALSE;}// --------------------------------------------------------------------/*** Minimum Length** @param string* @param string* @return bool*/public function min_length($str, $val){if ( ! is_numeric($val)){return FALSE;}return ($val <= mb_strlen($str));}// --------------------------------------------------------------------/*** Max Length** @param string* @param string* @return bool*/public function max_length($str, $val){if ( ! is_numeric($val)){return FALSE;}return ($val >= mb_strlen($str));}// --------------------------------------------------------------------/*** Exact Length** @param string* @param string* @return bool*/public function exact_length($str, $val){if ( ! is_numeric($val)){return FALSE;}return (mb_strlen($str) === (int) $val);}// --------------------------------------------------------------------/*** Valid URL** @param string $str* @return bool*/public function valid_url($str){if (empty($str)){return FALSE;}elseif (preg_match('/^(?:([^:]*)\:)?\/\/(.+)$/', $str, $matches)){if (empty($matches[2])){return FALSE;}elseif ( ! in_array($matches[1], array('http', 'https'), TRUE)){return FALSE;}$str = $matches[2];}$str = 'http://'.$str;// There's a bug affecting PHP 5.2.13, 5.3.2 that considers the// underscore to be a valid hostname character instead of a dash.// Reference: https://bugs.php.net/bug.php?id=51192if (version_compare(PHP_VERSION, '5.2.13', '==') OR version_compare(PHP_VERSION, '5.3.2', '==')){sscanf($str, 'http://%[^/]', $host);$str = substr_replace($str, strtr($host, array('_' => '-', '-' => '_')), 7, strlen($host));}return (filter_var($str, FILTER_VALIDATE_URL) !== FALSE);}// --------------------------------------------------------------------/*** Valid Email** @param string* @return bool*/public function valid_email($str){if (function_exists('idn_to_ascii') && $atpos = strpos($str, '@')){$str = substr($str, 0, ++$atpos).idn_to_ascii(substr($str, $atpos));}return (bool) filter_var($str, FILTER_VALIDATE_EMAIL);}// --------------------------------------------------------------------/*** Valid Emails** @param string* @return bool*/public function valid_emails($str){if (strpos($str, ',') === FALSE){return $this->valid_email(trim($str));}foreach (explode(',', $str) as $email){if (trim($email) !== '' && $this->valid_email(trim($email)) === FALSE){return FALSE;}}return TRUE;}// --------------------------------------------------------------------/*** Validate IP Address** @param string* @param string 'ipv4' or 'ipv6' to validate a specific IP format* @return bool*/public function valid_ip($ip, $which = ''){return $this->CI->input->valid_ip($ip, $which);}// --------------------------------------------------------------------/*** Alpha** @param string* @return bool*/public function alpha($str){return ctype_alpha($str);}// --------------------------------------------------------------------/*** Alpha-numeric** @param string* @return bool*/public function alpha_numeric($str){return ctype_alnum((string) $str);}// --------------------------------------------------------------------/*** Alpha-numeric w/ spaces** @param string* @return bool*/public function alpha_numeric_spaces($str){return (bool) preg_match('/^[A-Z0-9 ]+$/i', $str);}// --------------------------------------------------------------------/*** Alpha-numeric with underscores and dashes** @param string* @return bool*/public function alpha_dash($str){return (bool) preg_match('/^[a-z0-9_-]+$/i', $str);}// --------------------------------------------------------------------/*** Numeric** @param string* @return bool*/public function numeric($str){return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str);}// --------------------------------------------------------------------/*** Integer** @param string* @return bool*/public function integer($str){return (bool) preg_match('/^[\-+]?[0-9]+$/', $str);}// --------------------------------------------------------------------/*** Decimal number** @param string* @return bool*/public function decimal($str){return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str);}// --------------------------------------------------------------------/*** Greater than** @param string* @param int* @return bool*/public function greater_than($str, $min){return is_numeric($str) ? ($str > $min) : FALSE;}// --------------------------------------------------------------------/*** Equal to or Greater than** @param string* @param int* @return bool*/public function greater_than_equal_to($str, $min){return is_numeric($str) ? ($str >= $min) : FALSE;}// --------------------------------------------------------------------/*** Less than** @param string* @param int* @return bool*/public function less_than($str, $max){return is_numeric($str) ? ($str < $max) : FALSE;}// --------------------------------------------------------------------/*** Equal to or Less than** @param string* @param int* @return bool*/public function less_than_equal_to($str, $max){return is_numeric($str) ? ($str <= $max) : FALSE;}// --------------------------------------------------------------------/*** Value should be within an array of values** @param string* @param string* @return bool*/public function in_list($value, $list){return in_array($value, explode(',', $list), TRUE);}// --------------------------------------------------------------------/*** Is a Natural number (0,1,2,3, etc.)** @param string* @return bool*/public function is_natural($str){return ctype_digit((string) $str);}// --------------------------------------------------------------------/*** Is a Natural number, but not a zero (1,2,3, etc.)** @param string* @return bool*/public function is_natural_no_zero($str){return ($str != 0 && ctype_digit((string) $str));}// --------------------------------------------------------------------/*** Valid Base64** Tests a string for characters outside of the Base64 alphabet* as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045** @param string* @return bool*/public function valid_base64($str){return (base64_encode(base64_decode($str)) === $str);}// --------------------------------------------------------------------/*** Prep data for form** This function allows HTML to be safely shown in a form.* Special characters are converted.** @param string* @return string*/public function prep_for_form($data = ''){if ($this->_safe_form_data === FALSE OR empty($data)){return $data;}if (is_array($data)){foreach ($data as $key => $val){$data[$key] = $this->prep_for_form($val);}return $data;}return str_replace(array("'", '"', '<', '>'), array(''', '"', '<', '>'), stripslashes($data));}// --------------------------------------------------------------------/*** Prep URL** @param string* @return string*/public function prep_url($str = ''){if ($str === 'http://' OR $str === ''){return '';}if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0){return 'http://'.$str;}return $str;}// --------------------------------------------------------------------/*** Strip Image Tags** @param string* @return string*/public function strip_image_tags($str){return $this->CI->security->strip_image_tags($str);}// --------------------------------------------------------------------/*** Convert PHP tags to entities** @param string* @return string*/public function encode_php_tags($str){return str_replace(array('<?', '?>'), array('<?', '?>'), $str);}// --------------------------------------------------------------------/*** Reset validation vars** Prevents subsequent validation routines from being affected by the* results of any previous validation routine due to the CI singleton.** @return CI_Form_validation*/public function reset_validation(){$this->_field_data = array();$this->_config_rules = array();$this->_error_array = array();$this->_error_messages = array();$this->error_string = '';return $this;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。