Form Validation Functions
Easy Data Handler is a free PHP script you can include in your projects. It makes it easy to validate and sanitize form input and data pulled from the database. It has 2 functions, one for validating and another for sanitizing.
It can sanitize and validate the most common forms of data. There are plans to improve it and add more features, so make sure you get the most recent version on Github.
You can learn how to use it by going here.
<?php /* Easy Data Handler This plugin adds a series of functions that are used for validating, sanitizing, and displaying common data types. This is a set of functions to be used to work with other plugins and themes. 1.0.0 */ /* VALIDATE, SANITIZE, and DISPLAY FUNCTIONS Validation: This function returns true if it passes validation and false if it fails. Sanitization: This function returns sanitized values that are safe to store in database and display. First it sees if the value submitted validates for that format, if it doesn't it removes invalid characters. *** Note: if the safe value still does not validate, it may be set to a default value. If you don't want it to be changed, then use text. *** Display: These functions take values and prepares them for display on the website. Currently only supports US phone numbers and text. DATA TYPES: text - single line of text (default) - any text except html or php tags multitext - multiline text letters1a - A-Z, a-z, whitespace letters1b - A-Z, a-z, no whitespace alphanum1a - A-Z, a-z, 0-9, whitespace alphanum1b - A-Z, a-z, 0-9, no whitespace alphanum2a - A-Z, a-z, 0-9, -, _, ., whitespace alphanum2b - A-Z, a-z, 0-9, -, _, ., no whitespace num - 0-9, no whitespace (positive integer) numneg - 0-9, -, no whitespace (positive or negative integer) numdec - 0-9, ., no whitespace (positive decimal number) numdecneg - 0-9, ., -, no whitespace (positive or negative decimal number) email - email address phone - US phone number intphone - international phone number money - number with 2 decimal places (eg. 123.45) currency - US currency with 2 decimal places (eg. $123.45) date - any valid date format time - any valid time format url - website address (eg. domainname.com or https://domainname.com) password - 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long passwordstrong - 1 lowercase letter, 1 uppercase letter, 1 number, 1 special character and be at least 8 characters long ip (both ipv4 and ipv6) - IP address ###.###.###.### (ipv4)) ####:####:####:####:####:####:####:#### (ipv6) For the following fields, use the following data types: name - text, letters1a, or alphanum2a address - text or alphanum2a city - text, letters1a, or alphanum2a state - text, letters1a, or alphanum2a country - text, letters1a, or alphanum2a zip/postal code - alphanum1a or alphanum2b username - letters1a, alphanum1b, or alphanum2b email - email message - multitext phone - phone or intphone currency - money or currency ip address - ip */ // VALIDATION /* This function validates data based on the type selected. It is simply an indicator of if it passes or not, and it does not state what is wrong. Please see each type above to find out what is allowed and what is not. $data - the value to be validated $type - the data type (see above for list) $min - minimum number of characters required, default 1 $max - maximum number of characters allowed, max of 0 is unlimited, default 0 $info - only used by date and time returns true or false, true if passed, false if failed */ function edh_validate($data = '', $type = 'text', $min = 0, $max = 0, $info = '') { $isvalid = false; // default fail if ($data != '' && $data != null): // Safety net - Set default values if not set if ($type == '' || $type == null): $type = 'text'; endif; if ($min == '' || $min == null): $min = 1; endif; if ($max == '' || $max == null): $max = 0; endif; // Switch statement to check for data type switch($type) { // text - single line of text (default) case 'text': // runs $data through strip_tags () then compares it to original value // This allows for any characters - but it detects any html or php code and removes it $sanitized = wp_strip_all_tags($data, $remove_breaks = true); // removes html and php code if ($data == $sanitized): $isvalid = true; endif; break; // multitext - multiline text case 'multitext': // runs $data through strip_tags () then compares it to original value // This allows for any characters - but it detects any html or php code and removes it $sanitized = wp_strip_all_tags($data, $remove_breaks = false); if (rtrim($data) == $sanitized): $isvalid = true; endif; break; // letters1a - A-Z, a-z, whitespace case 'letters1a': // Regex $pattern = "/^[a-zA-Z ]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // letters1b - A-Z, a-z, no whitespace case 'letters1b': // Regex $pattern = "/^\d+$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // alphanum1a - A-Z, a-z, 0-9, whitespace case 'alphanum1a': // Regex $pattern = "/^[a-zA-Z0-9 ]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // alphanum1b - A-Z, a-z, 0-9, no whitespace case 'alphanum1b': // Regex $pattern = "/^[a-zA-Z0-9]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // alphanum2a - A-Z, a-z, 0-9, -, _, ., whitespace case 'alphanum2a': // Regex $pattern = "/^[a-zA-Z0-9 .\-_]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // alphanum2b - A-Z, a-z, 0-9, -, _, ., no whitespace case 'alphanum2b': // Regex $pattern = "/^[a-zA-Z0-9.\-_]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // num - whole numbers (positive) case 'num': // Regex $pattern = "/^\d+$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // numneg - whole numbers (positive or negative) case 'numneg': // Regex $pattern = "/^-?\d+$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // numdec - whole and decimal numbers case 'numdec': // Regex $pattern = "/^\d*(\.\d+)?$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // numdecneg - whole, decimal, and negative numbers case 'numdecneg': // Regex $pattern ="/^-?\d*(\.\d+)?$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // email - email address case 'email': $sanitized = sanitize_email($data); if ($data == $sanitized): $isvalid = true; endif; break; // phone - US phone number case 'phone': // Regex $tel = array(); // ###-###-#### $tel[0] = "/^[0-9]{3}[\-]{1}[0-9]{3}[\-]{1}[0-9]{4}$/"; // ###.###.#### $tel[1] = "/^[0-9]{3}[\.]{1}[0-9]{3}[\.]{1}[0-9]{4}$/"; // ### ### #### $tel[2] = "/^[0-9]{3}[ ]{1}[0-9]{3}[ ]{1}[0-9]{4}$/"; // (###) ###-#### $tel[3] = "/^[(]{1}[0-9]{3}[)]{1}[ ]?[0-9]{3}[\-]{1}[0-9]{4}$/"; // ########## $tel[4] = "/^[0-9]{10}$/"; foreach($tel as $reg): if (preg_match($reg, $data)) : $isvalid = true; endif; endforeach; break; // intphone - international phone number case 'intphone': // Regex $pattern = "/^[0-9 .\+\-()]*$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // money - number with 2 decimal places (eg. 123 or 123.45) case 'money': // Regex $pattern = "/^[0-9]+[.]?[0-9]{2}$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // currency - US currency with 2 decimal places (eg. $123.45) case 'currency': // Regex $pattern = "/^[$][0-9]+[.][0-9]{2}$/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // date - ensures date entered is valid // year values allowed: 1000-2999 case 'date': // Regex switch ($info) { // m/d/Y case 0: $pattern = "/((0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/[12]\d{3})/"; break; // m-d-Y case 1: $pattern = "/((0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])-[12]\d{3})/"; break; // d/m/Y case 2: $pattern = "/((0[1-9]|[12]\d|3[01])\/(0[1-9]|1[0-2])\/[12]\d{3})/"; break; // d-m-Y case 3: $pattern = "/((0[1-9]|[12]\d|3[01])-(0[1-9]|1[0-2])-[12]\d{3})/"; break; // mysql datetime YYYY-MM-DD HH:MM:SS case 4: $pattern = "/([12]\d{3})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) (?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)/"; break; // mysql date YYYY-MM-DD case 5: $pattern = "/([12]\d{3})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])/"; break; default: // mm/dd/yyyy $pattern = "/((0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/[12]\d{3})/"; break; } if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // time case 'time': // Regex switch ($info) { case 'HH:MM': // Time Format HH:MM 12-hour, optional leading 0 $pattern = "/^(0?[1-9]|1[0-2]):[0-5][0-9]$/"; break; case 'HH:MM AM': // Time Format HH:MM 12-hour, optional leading 0, Meridiems (AM/PM) $pattern = "/((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/"; break; case 'HH:MM:SS': // Time Format HH:MM:SS 12-hour, optional leading 0 $pattern = "/((1[0-2]|0?[1-9]):([0-5][0-9]):(?:[012345]\d))/"; break; case 'HH:MM:SS AM': // Time Format HH:MM:SS 12-hour, optional leading 0, Meridiems (AM/PM) $pattern = "/((1[0-2]|0?[1-9]):([0-5][0-9]):(?:[012345]\d) ?([AaPp][Mm]))/"; break; case 'HH:MM 24': // Time Format HH:MM 24-hour, optional leading 0 $pattern = "/^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/"; break; case 'HH:MM:SS 24': //Time Format HH:MM:SS 24-hour $pattern = "/(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)/"; break; default: // default HH:MM 12-hour $pattern = "/^(0?[1-9]|1[0-2]):[0-5][0-9]$/"; break; } if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // url - website address (eg. domainname.com or https://domainname.com) case 'url': $sanitized = esc_url_raw($data); if ($data == $sanitized): $isvalid = true; endif; break; // passwordweak - 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long // special characters: .* ^&$@#:=+-_~!?% case 'password': // this checks $data for required elements and makes sure it's safe to store $pattern_upper = "/^.*(?=\S*[A-Z]).*$/"; $pattern_lower = "/^.*(?=\S*[a-z]).*$/"; $pattern_num = "/^.*(?=\S*[0-9]).*$/"; $pattern_chars = "/^[a-zA-Z0-9.* ^&$@#:=+\-_~!?%]+$/"; $uppercase = preg_match($pattern_upper, $data); $lowercase = preg_match($pattern_lower, $data); $number = preg_match($pattern_num, $data); $valid_char = preg_match($pattern_chars, $data); if($uppercase && $lowercase && $number && $valid_char && strlen($data) > 7) { $isvalid = true; } break; // passwordstrong - 1 lowercase letter, 1 uppercase letter, 1 number, 1 special character and be at least 8 characters long // special characters: case 'passwordstrong': // Regex // this checks $data for required elements and makes sure it's safe to store $pattern_upper = "/^.*(?=\S*[A-Z]).*$/"; $pattern_lower = "/^.*(?=\S*[a-z]).*$/"; $pattern_num = "/^.*(?=\S*[0-9]).*$/"; $pattern_special = "/^.*(?=\S*[.* ^&$@#:=+\-_~!?%]).*$/"; $pattern_chars = "/^[a-zA-Z0-9.* ^&$@#:=+\-_~!?%]+$/"; $uppercase = preg_match($pattern_upper, $data); $lowercase = preg_match($pattern_lower, $data); $number = preg_match($pattern_num, $data); $special = preg_match($pattern_special, $data); $valid_char = preg_match($pattern_chars, $data); if($uppercase && $lowercase && $number && $special && $valid_char && strlen($data) > 7) { $isvalid = true; } break; $pattern = "/(?=(.*[0-9]))(?=.*[\!@#$%^&*()\\[\]{}\-_+=~`|:;\"'<>,./?])(?=.*[a-z])(?=(.*[A-Z]))(?=(.*)).{8,}/"; if (preg_match($pattern, $data)) : $isvalid = true; endif; break; // ipadd (both ipv4 and ipv6) - IP address case 'ip': // Regex $ipv4_pattern = "/^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/"; $ipv6_pattern = "/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/"; // is valid ipv4 if (preg_match($ipv4_pattern, $data)) : $isvalid = true; endif; if (preg_match($ipv6_pattern, $data)) : $isvalid = true; endif; break; // default is text default: $sanitized = sanitize_text_field($data); if ($data == $sanitized): $isvalid = true; endif; break; } endif; // check length if ($isvalid == true): // get length of $data $datalength = strlen($data); if ($min > 0): $setmin = $min - 1; if ($datalength < $setmin): $isvalid = false; endif; endif; if ($max > 0): $setmax = $max - 1; if ($datalength > $setmax): $isvalid = false; endif; endif; endif; return $isvalid; } // SANITIZATION /* This function takes the data its given and changes it IF it fails validation. If it It will remove all invalid characters, put it in the proper format (if needed), and trim the value if set. The returned value should be safe to store in the database as it does not allow any <> () [] type of characters used in scripting or it convers them to html entities. If the altered value does not match the type, it may use defaults. This only applies to: time $data - the value to be validated $type - the data type (see above for list) $trim - max number of characters to return (discards the rest), 0 is unlimited, default is 0 $info - only used by phone, date, time, and ip returns sanitized value */ function edh_sanitize($data = '', $type = 'text', $trim = 0, $info = '') { $clean_data = ''; if ($data != '' && $data != null): // set default values if ($type == '' || $type == null): $type = 'text'; endif; if ($trim == '' || $trim == null): $trim = 0; endif; switch($type) { // text - single line of text (default) case 'text': $clean_data = sanitize_text_field($data); break; // multitext - multiline text case 'multitext': $clean_data = sanitize_textarea_field($data); break; // letters1a - A-Z, a-z, whitespace case 'letters1a': if (edh_validate($data, 'letters1a')) : $clean_data = $data; // data is already valid else : $pattern = "/[^A-Za-z ]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // letters1b - A-Z, a-z, no whitespace case 'letters1b': if (edh_validate($data, 'letters1b')) : $clean_data = $data; // data is already valid else : $pattern = "/[^A-Za-z]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // alphanum1a - A-Z, a-z, 0-9, whitespace case 'alphanum1a': if (edh_validate($data, 'alphanum1a')) : $clean_data = $data; // data is already valid else : $pattern = "/[^a-zA-Z0-9 ]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // alphanum1b - A-Z, a-z, 0-9, no whitespace case 'alphanum1b': if (edh_validate($data, 'alphanum1b')) : $clean_data = $data; // data is already valid else : $pattern = "/[^a-zA-Z0-9]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // alphanum2a - A-Z, a-z, 0-9, -, _, ., whitespace case 'alphanum2a': if (edh_validate($data, 'alphanum2a')) : $clean_data = $data; // data is already valid else : $pattern = "/[^a-zA-Z0-9 .\-_]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // alphanum2b - A-Z, a-z, 0-9, -, _, ., no whitespace case 'alphanum2b': if (edh_validate($data, 'alphanum2b')) : $clean_data = $data; // data is already valid else : $pattern = "/[^a-zA-Z0-9.\-_]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // num - whole numbers (positive) case 'num': if (edh_validate($data, 'num')) : $clean_data = $data; // data is already valid else : $pattern = "/[^\d+]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // numneg - whole numbers (positive or negative) case 'numneg': if (edh_validate($data, 'numneg')) : $clean_data = $data; // data is already valid else : $pattern = "/[^-?\d+]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // numdec - whole and decimal numbers case 'numdec': if (edh_validate($data, 'numdec')) : $clean_data = $data; // data is already valid else : $pattern = "/[^\d*(\.\d+)?]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // numdecneg - whole, decimal, and negative numbers case 'numdecneg': if (edh_validate($data, 'numdecneg')) : $clean_data = $data; // data is already valid else : $pattern = "/[^-?\d*(\.\d+)?]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // email - email address case 'email': if (edh_validate($data, 'email')) : $clean_data = $data; else: $clean_data = sanitize_email($data); endif; break; // phone - US phone number case 'phone': if (edh_validate($data, 'phone')) : $clean_data = $data; // data is already valid else : // remove all characters except numbers $pattern = "/[^0-9]/"; $clean_data = preg_replace($pattern, '', $data); // Break number into sections $part1 = substr($clean_data, 0, 3); $part2 = substr($clean_data, 3, 3); $part3 = substr($clean_data, 6, 4); switch ($info) { // ###-###-#### case 0: $clean_data = $part1 . '-' . $part2 . '-' . $part3; break; // ###.###.#### case 1: $clean_data = $part1 . '.' . $part2 . '.' . $part3; break; // ### ### #### case 2: $clean_data = $part1 . ' ' . $part2 . ' ' . $part3; break; // (###) ###-#### case 3: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; // ########## case 4: $clean_data = $part1 . $part2 . $part3; break; // (###) ###-#### default: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; } // if the cleaned value is not a proper phone number, return a default if (!edh_validate($clean_data, 'phone')) : $part1 = '000'; $part2 = '000'; $part3 =-'0000'; switch ($info) { // ###-###-#### case 0: $clean_data = $part1 . '-' . $part2 . '-' . $part3; break; // ###.###.#### case 1: $clean_data = $part1 . '.' . $part2 . '.' . $part3; break; // ### ### #### case 2: $clean_data = $part1 . ' ' . $part2 . ' ' . $part3; break; // (###) ###-#### case 3: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; // ########## case 4: $clean_data = $part1 . $part2 . $part3; break; // (###) ###-#### default: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; } endif; endif; break; // intphone - international phone number case 'intphone': if (edh_validate($data, 'intphone')) : $clean_data = $data; // data is already valid else : $pattern = "/[^0-9 .\+\-()]/"; $clean_data = preg_replace($pattern, '', $data); endif; break; // money - number with 2 decimal places (eg. 123 or 123.45) case 'money': if (edh_validate($data, 'money')) : $clean_data = $data; // data is already valid else : // remove all invalid characters $pattern = "/[^0-9.]/"; $clean_data = preg_replace($pattern, '', $data); $pattern2 = "/[.+]/"; // find the decimal $pattern3 = "/[^0-9]/"; // numbers only // if the number has a decimal.. if (preg_match($pattern2, $clean_data)): // get the position of the decimal $decpos = strpos($clean_data, '.'); // get number of char in first part $totalchar = $decpos; // set starting position for second part $position = $decpos + 1; // Break number into sections // if there is no digit before the decimal like .24, make $part1 = 0 if ($decpos == 0): $part1 = '0'; else: // part before decimal $part1 = substr($clean_data, 0, $totalchar); endif; // part after decimal $part2 = substr($clean_data, $position); // clean second part to remove additional decimals $part2 = preg_replace($pattern3, '', $part2); // put the number back together $clean_data = $part1 . '.' . $part2; endif; // puts the number in the format ###.## or #.## $clean_data = number_format($clean_data, 2, '.', ''); endif; break; // currency - US currency with 2 decimal places (eg. $123.45) case 'currency': if (edh_validate($data, 'currency')) : $clean_data = $data; // data is already valid else : $money = edh_sanitize($data, 'money'); $clean_data = '$' . $money; endif; break; // date - if invalid date is given, returns current date in desired format // year values allowed: 1000-2999 case 'date': if (edh_validate($data, 'date', 0, 0, $info)) : $clean_data = $data; // data is already valid else : // remove all characters except numbers $pattern = "/[^0-9]/"; $clean_data = preg_replace($pattern, '', $data); $clean_data_length = strlen($clean_data); // if the date is the correct length... if ($clean_data_length == 8 || $clean_data_length == 14): // Break number into sections $part1 = substr($clean_data, 0, 2); // mm or dd $part2 = substr($clean_data, 2, 2); // dd or mm $part3 = substr($clean_data, 4, 4); // yyyy switch ($info) { // m/d/Y case 0: $clean_data = $part1 . '/' . $part2 . '/' . $part3; break; // m-d-Y case 1: $clean_data = $part1 . '-' . $part2 . '-' . $part3; break; // d/m/Y case 2: $clean_data = $part1 . '/' . $part2 . '/' . $part3; break; // d-m-Y case 3: $clean_data = $part1 . '-' . $part2 . '-' . $part3; break; // mysql datetime YYYY-MM-DD HH:MM:SS case 4: $part1 = substr($clean_data, 0, 4); // yyyy $part2 = substr($clean_data, 4, 2); // MM $part3 = substr($clean_data, 6, 2); // DD $part4 = substr($clean_data, 8, 2); // HH $part5 = substr($clean_data, 10, 2); // MM $part6 = substr($clean_data, 12, 2); // SS $clean_data = $part1 . '-' . $part2 . '-' . $part3 . ' ' . $part4 . ':' . $part5 . ':' . $part6; // mysql date YYYY-MM-DD case 5: $part1 = substr($clean_data, 0, 4); // yyyy $part2 = substr($clean_data, 4, 2); // MM $part3 = substr($clean_data, 6, 2); // DD $clean_data = $part1 . '-' . $part2 . '-' . $part3; default: $clean_data = $part1 . '/' . $part2 . '/' . $part3; break; } endif; // if the cleaned date is invalid if (!edh_validate($clean_data, 'date', 0, 0, $info)) : // set to current date based on type $format = ''; switch($info) { case 0: $format = 'm/d/Y'; break; case 1: $format = 'm-d-Y'; break; case 2: $format = 'd/m/Y'; break; case 3: $format = 'd-m-Y'; break; case 4: $format = 'Y-m-d H:i:s'; break; case 5: $format = 'Y-m-d'; break; default: $format = 'm/d/Y'; break; } $clean_data = date($format); // current server time endif; endif; break; // time case 'time': if (edh_validate($data, 'time', 0, 0, $info)) : $clean_data = $data; // data is already valid else : // remove all characters except numbers $pattern = "/[^0-9APM]/"; $clean_data = preg_replace($pattern, '', $data); // find the position of the first : $colonpos = strpos($data, ':'); if ($colonpos == 1) : // if the position is = 1, then expect #:##:## switch($info) { // HH:MM case 'HH:MM': // Break number into sections $part1 = substr($clean_data, 0, 1); // H $part2 = substr($clean_data, 1, 2); // MM $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':' . $part2; break; // HH:MM AM case 'HH:MM AM': // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = substr($clean_data, 3, 2); // AM/PM 3 4 $part4 = ''; // SS // If time not valid, set to default 1:00 AM if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 != 'AM' && $part3 != 'PM'): $part3 = 'AM'; endif; $clean_data = $part1 . ':' . $part2 . ' ' . $part3; break; // HH:MM:SS case 'HH:MM:SS': // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = substr($clean_data, 3, 2); // SS 3 4 $part4 = ''; // AM/PM // If time not valid, set to default 1:00:00 if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3; break; // HH:MM:SS AM case 'HH:MM:SS AM': // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = substr($clean_data, 3, 2); // SS 3 4 $part4 = substr($clean_data, 5, 2); // AM/PM 5 6 // If time not valid, set to default 1:00:00 AM if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; if ($part4 != 'AM' && $part4 != 'PM'): $part4 = 'AM'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3 . ' ' . $part4; break; // HH:MM 24 case 'HH:MM 24': // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':'. $part2; break; // HH:MM:SS 24 case 'HH:MM:SS 24': // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = substr($clean_data, 3, 2); // SS 3 4 $part4 = ''; // AM/PM // If time not valid, set to default 1:00:00 if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3; break; default: // Break number into sections $part1 = substr($clean_data, 0, 1); // H 0 $part2 = substr($clean_data, 1, 2); // MM 1 2 $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 9): $part1 = 1; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':' . $part2; break; } else: // else expect ##:##:## switch($info) { // HH:MM case 'HH:MM': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH $part2 = substr($clean_data, 2, 2); // MM $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':' . $part2; break; // HH:MM AM case 'HH:MM AM': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = substr($clean_data, 4, 2); // AM/PM 4 5 $part4 = ''; // SS // If time not valid, set to default 1:00 AM if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 != 'AM' && $part3 != 'PM'): $part3 = 'AM'; endif; $clean_data = $part1 . ':' . $part2 . ' ' . $part3; break; // HH:MM:SS case 'HH:MM:SS': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = substr($clean_data, 4, 2); // SS 4 5 $part4 = ''; // AM/PM // If time not valid, set to default 1:00:00 if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3; break; // HH:MM:SS AM case 'HH:MM:SS AM': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = substr($clean_data, 4, 2); // SS 4 5 $part4 = substr($clean_data, 6, 2); // AM/PM 6 7 // If time not valid, set to default 1:00:00 AM if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; if ($part4 != 'AM' && $part4 != 'PM'): $part4 = 'AM'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3 . ' ' . $part4; break; // HH:MM 24 case 'HH:MM 24': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':'. $part2; break; // HH:MM:SS 24 case 'HH:MM:SS 24': // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = substr($clean_data, 4, 2); // SS 4 5 $part4 = ''; // AM/PM // If time not valid, set to default 1:00:00 if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; if ($part3 < 0 || $part3 > 59): $part3 = '00'; endif; $clean_data = $part1 . ':' . $part2 . ':' . $part3; break; default: // Break number into sections $part1 = substr($clean_data, 0, 2); // HH 0 1 $part2 = substr($clean_data, 2, 2); // MM 2 3 $part3 = ''; // SS $part4 = ''; // AM/PM // If time not valid, set to default 1:00 if ($part1 < 1 || $part1 > 12): $part1 = 12; endif; if ($part2 < 0 || $part2 > 59): $part2 = '00'; endif; $clean_data = $part1 . ':' . $part2; break; } endif; endif; break; // url - website address (eg. domainname.com or https://domainname.com) case 'url': if (edh_validate($data, 'url')) : $clean_data = $data; else : $clean_data = esc_url_raw($data); endif; break; // passwordweak - 1 lowercase letter, 1 uppercase letter, 1 number, and be at least 8 characters long case 'password': if (edh_validate($data, 'password')) : $clean_data = $data; else : // if the password does not have valid characters // remove invalid characters $pattern = "/[^a-zA-Z0-9.* ^&$@#:=+\-_~!?%]/"; $clean_data = preg_replace($pattern, '', $data); // revalidate - if it fails, generate a random password if (!edh_validate($clean_data, 'password')) : $newpassword = ''; while(!edh_validate($newpassword, 'password')): $newpassword = edh_generate_password(); endwhile; $clean_data = $newpassword; endif; endif; break; // passwordstrong - 1 lowercase letter, 1 uppercase letter, 1 number, 1 special character and be at least 8 characters long case 'passwordstrong': if (edh_validate($data, 'passwordstrong')) : $clean_data = $data; else : // if the password does not have valid characters // remove invalid characters $pattern = "/[^a-zA-Z0-9.* ^&$@#:=+\-_~!?%]/"; $clean_data = preg_replace($pattern, '', $data); // revalidate - if it fails, generate a random password if (!edh_validate($clean_data, 'passwordstrong')) : $newpassword = ''; while(!edh_validate($newpassword, 'passwordstrong')): $newpassword = edh_generate_password(); endwhile; $clean_data = $newpassword; endif; endif; break; // ipadd (both ipv4 and ipv6) - IP address case 'ip': if (edh_validate($data, 'ip')) : $clean_data = $data; else: // based on info, return blank ip address switch($info) { case 'ipv4': $clean_data = '0.0.0.0'; break; case 'ipv6': $clean_data = '0000:0000:0000:0000:0000:0000:0000:0000'; break; default: $clean_data = '0.0.0.0'; break; } endif; default: $clean_data = sanitize_text_field($data); break; } endif; // trim if ($trim > 0): $datalength = strlen($data); if ($datalength > $trim): $clean_data = substr($clean_data, 0, $trim); endif; endif; return $clean_data; } // DISPLAY FUNCTIONS // US Phone Number Formatting /* This function is intended to help format a phone number from the database in a consistent way, regardless of how it was stored. $data - the value to be displayed $format - a number 0-4 that determines the format returns the phone number in the proper format */ function edh_display_phone($data, $format) { if ($data != '' && $data != null) : // remove all characters except numbers $pattern = "/[^0-9]/"; $clean_data = preg_replace($pattern, '', $data); // Break number into sections $part1 = substr($clean_data, 0, 3); $part2 = substr($clean_data, 3, 3); $part3 = substr($clean_data, 6, 4); switch ($format) { // ###-###-#### case 0: $clean_data = $part1 . '-' . $part2 . '-' . $part3; break; // ###.###.#### case 1: $clean_data = $part1 . '.' . $part2 . '.' . $part3; break; // ### ### #### case 2: $clean_data = $part1 . ' ' . $part2 . ' ' . $part3; break; // (###) ###-#### case 3: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; // ########## case 4: $clean_data = $part1 . $part2 . $part3; break; // (###) ###-#### default: $clean_data = '(' . $part1 . ') ' . $part2 . '-' . $part3; break; } else : $clean_data = ''; endif; return $clean_data; } // Display Text Values /* The purpose of this function is to prepare data for editing inside a form. If the value you want to display has characters that have been escaped such as \' then it can remove that in mode 1 or 2. If the value has HTML entities and you want to display them in a textbox or textarea for editing, then you would use mode 0 or 2. This is needed for text values that allow for all character strings. $data - the string to prepare $mode - what kind of preparation is needed 0: Text Fields - decode html entities (default) 1: Textarea - decodes html entities and removes slashes * Note: Do not use this on input fields because it can cause conflict if "" are entered and output in the field value. 2: remove slashes returns the string after performing requested task */ function edh_display_text($data, $mode = 0) { $result = ''; if ($data != '' && $data != null): if ($mode == '' || $mode == null): $mode = 0; endif; switch ($mode) { case 0: // Text Fields // convert html entities to characters $result = html_entity_decode($data); // strip slashes and remove " $result = stripslashes_deep($result); $result = str_replace('"', "", $result); // convert <br>s to new lines $result = str_replace("<br>", "", $result); break; case 1: // Textarea // It will strip the slashes from quotes which can break the // remove slashes - escaped characters like \' become ' $result = stripslashes_deep($data); // convert html entities to characters $result = html_entity_decode($result); // convert <br>s to new lines $result = str_replace("<br>", "\r\n", $result); break; case 2: // remove slashes - escaped characters like \' become ' $result = stripslashes_deep($data); break; default: // convert html entities to characters $result = html_entity_decode($data); // convert <br>s to new lines $result = str_replace("<br>", "\r\n", $result); break; } endif; return $result; } // PASSWORD FUNCTIONS function edh_generate_password() { $lowercase = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); $uppercase = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $numbers = array('0','1','2','3','4','5','6','7','8','9'); $special = array('.','*','^','8','$','@','#',':','=','+','-','_','~','!','?','%'); $generate_password = ''; $counter_low = 0; $counter_up = 0; $counter_num = 0; $counter_spec = 0; $counter = 0; while(strlen($generate_password) < 8) { if (($counter_low > 0 || $counter_up > 0) && ($counter < 7) && ($counter_num < 3)): $picktype = rand(1,3); else: $picktype = rand(1,2); endif; switch ($picktype) { case 1: $counter_low++; $generate_password = $generate_password . $lowercase[rand(0,25)]; break; case 2: $counter_up++; $generate_password = $generate_password . $uppercase[rand(0,25)]; break; case 3: $counter_num++; $generate_password = $generate_password . $numbers[rand(0,9)]; break; case 4: $counter_spec++; $generate_password = $generate_password . $special[rand(0,15)]; break; } } return $generate_password; } function edh_generate_strong_password() { $lowercase = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); $uppercase = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $numbers = array('0','1','2','3','4','5','6','7','8','9'); $special = array('.','*','^','8','$','@','#',':','=','+','-','_','~','!','?','%'); $generate_password = ''; $counter_low = 0; $counter_up = 0; $counter_num = 0; $counter_spec = 0; $counter = 0; while(strlen($generate_password) < 12) { if (($counter_low > 0 || $counter_up > 0) && ($counter < 7) && ($counter_num < 3) && ($counter_spec < 3)): $picktype = rand(1,4); else: $picktype = rand(1,2); endif; switch ($picktype) { case 1: $counter_low++; $generate_password = $generate_password . $lowercase[rand(0,25)]; break; case 2: $counter_up++; $generate_password = $generate_password . $uppercase[rand(0,25)]; break; case 3: $counter_num++; $generate_password = $generate_password . $numbers[rand(0,9)]; break; case 4: $counter_spec++; $generate_password = $generate_password . $special[rand(0,15)]; break; } } return $generate_password; } // DATE CONVERSIONS // DATE TO MYSQL DATETIME /* This function converts a date into the MySQL DateTime format. It takes any date, converts it to unix time, then puts it in the proper format. $date - is the date that needs to be converted $format - is a number 0 or 2 (default is 0) returns the converted date or false if not valid */ function edh_convert_date2mysqldatetime($date, $format = 0) { if ($date != '' && $date != null) : // remove all characters except numbers $pattern = "/[^0-9]/"; $date_digits = preg_replace($pattern, '', $date); $part1 = substr($date_digits, 0, 2); // mm or dd $part2 = substr($date_digits, 2, 2); // dd or mm $part3 = substr($date_digits, 4, 4); // yyyy switch($format) { // m/d/Y or m/d/Y case 0: $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; // d/m/Y or d-m-Y case 1: $unixtime = date("U", mktime(0, 0, 0, $part2, $part1, $part3)); break; // unix timestamp case 2: $unixtime = $date_digits; break; default: // m/d/Y or m/d/Y $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; } // if the converted date is not valid, return false if (!edh_validate($converted_date, 'date', 0, 0, 4)) : return false; else: // otherwise return the datetime return $converted_date; endif; else: return false; endif; } // DATE TO MYSQL DATE /* This function converts a date into the MySQL Date format. It takes any date, converts it to unix time, then puts it in the proper format. *** Valid years are 1000 to 2999 *** $date - is the date that needs to be converted $format - is a number 0 or 2 (default is 0) returns the converted date or false if not valid */ function edh_convert_date2mysqldate($date, $format = 0) { if ($date != '' && $date != null) : // remove all characters except numbers $pattern = "/[^0-9]/"; $date_digits = preg_replace($pattern, '', $date); $part1 = substr($date_digits, 0, 2); // mm or dd $part2 = substr($date_digits, 2, 2); // dd or mm $part3 = substr($date_digits, 4, 4); // yyyy switch($format) { // m/d/Y or m/d/Y case 0: $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; // d/m/Y or d-m-Y case 1: $unixtime = date("U", mktime(0, 0, 0, $part2, $part1, $part3)); break; // unix timestamp case 2: $unixtime = $date_digits; break; default: // m/d/Y or m/d/Y $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; } $converted_date = date('Y-m-d', $unixtime); // if the converted date is not valid, return false if (!edh_validate($converted_date, 'date', 0, 0, 5)) : return false; else : // otherwise return the datetime return $converted_date; endif; else : return false; endif; } // DATE TO UNIX /* This function converts a date into a unix timestamp. It takes any date, converts it to unix time. You can then use it to display whatever format you like. *** Valid years are 1000 to 2999 *** $date - is the date that needs to be converted $format - is a number 0 or 1 (default is 0) returns the converted unix timestamp */ function edh_convert_date2unix($date, $format = 0) { if ($date != '' && $date != null) : // remove all characters except numbers $pattern = "/[^0-9]/"; $date_digits = preg_replace($pattern, '', $date); $part1 = substr($date_digits, 0, 2); // mm or dd $part2 = substr($date_digits, 2, 2); // dd or mm $part3 = substr($date_digits, 4, 4); // yyyy switch($format) { // m/d/Y or m/d/Y case 0: $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; // d/m/Y or d-m-Y case 1: $unixtime = date("U", mktime(0, 0, 0, $part2, $part1, $part3)); break; // m/d/Y H:i:s 24 case 2: $part4 = substr($date_digits, 8, 2); $part5 = substr($date_digits, 10, 2); $part6 = substr($date_digits, 12, 2); if ($part4 == '') $part4 = 0; if ($part5 == '') $part5 = 0; if ($part6 == '') $part6 = 0; $unixtime = date("U", mktime($part4, $part5, $part6, $part2, $part1, $part3)); default: // m/d/Y or m/d/Y $unixtime = date("U", mktime(0, 0, 0, $part1, $part2, $part3)); break; } return $unixtime; else : return false; endif; } // Strips all HTML and PHP tags function wp_strip_all_tags($text = '') { $clean_text = strip_tags($text); return $clean_text; } function sanitize_text_field($text = '') { $clean_text = filter_var($text, FILTER_SANITIZE_STRING); return $clean_text; } function sanitize_email($email = '') { $clean_text = filter_var($email, FILTER_SANITIZE_EMAIL); return $clean_text; } // Strips function sanitize_textarea_field($text = '', $html = false) { if ($text != ''): $text = nl2br($text, false); // false = <br>, true = <br /> $text_lines = explode("<br>", $text); foreach ($text_lines as $key => $val): $val = trim($val); $val = stripslashes($val); if ($html === false): $val = strip_tags($val); else: $val = strip_tags($val, '<br>'); endif; $val = htmlspecialchars($val); $text_lines[$key] = $val; endforeach; if ($html): return implode("<br>", $text_lines); else: return implode("\r\n", $text_lines); endif; else: return ''; endif; } ?>