core/api/php/clean.php

380 lines
9.7 KiB
PHP
Raw Permalink Normal View History

2022-12-11 13:55:49 +05:00
<?php
/**
* Очистка данных из форм.
* https://snipp.ru/view/396
* https://github.com/snipp-ru/clean
*/
class Clean
{
/**
* Предварительная обработка строки.
*/
private static function _prepare($value)
{
$value = strval($value);
$value = stripslashes($value);
$value = str_ireplace(array("\0", "\a", "\b", "\v", "\e", "\f"), ' ', $value);
$value = htmlspecialchars_decode($value, ENT_QUOTES);
return $value;
}
/**
* Логический тип (0 или 1).
*/
public static function bool($value, $default = 0)
{
$value = self::_prepare($value);
$value = mb_ereg_replace('[\s]', '', $value);
$value = str_ireplace(array('-', '+', 'false', 'null', 'off'), '', $value);
return (empty($value)) ? $default : 1;
}
/**
* Логический тип для массива.
*/
public static function boolArray($value, $default = 0)
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::bool($row, $default);
}
return $res;
}
/**
* Логический тип для массива, результат объединённый в строку.
*/
public static function boolList($value, $default = 0, $separator = ',')
{
return implode($separator, self::boolArray($value, $default));
}
/**
* Целое положительное число.
*/
public static function int($value, $default = 0)
{
$value = self::_prepare($value);
$value = mb_ereg_replace('[\s]', '', $value);
$value = abs(intval($value));
return (empty($value)) ? $default : $value;
}
/**
* Целое положительное число для массива.
*/
public static function intArray($value, $default = 0)
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::int($row, $default);
}
return $res;
}
/**
* Целое положительное число для массива, результат объединённый в строку.
*/
public static function intList($value, $default = 0, $separator = ',')
{
return implode($separator, self::intArray($value, $default));
}
/**
* Число с плавающей точкой. Может быть отрицательным.
*/
public static function float($value, $default = 0)
{
$value = self::_prepare($value);
$value = mb_ereg_replace('[\s]', '', $value);
$value = str_replace(',', '.', $value);
$value = floatval($value);
return (empty($value)) ? $default : $value;
}
/**
* Число с плавающей точкой для массива.
*/
public static function floatArray($value, $default = 0)
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::float($row, $default);
}
return $res;
}
/**
* Число с плавающей точкой для массива, результат объединённый в строку.
*/
public static function floatList($value, $default = 0, $separator = ',')
{
return implode($separator, self::floatArray($value, $default));
}
/**
* Цена.
*/
public static function price($value, $default = 0)
{
$value = self::_prepare($value);
$value = mb_ereg_replace('[^0-9\.,]', '', $value);
$value = mb_ereg_replace('[,]+', ',', $value);
$value = mb_ereg_replace('[.]+', '.', $value);
$pos_1 = mb_strpos($value, '.');
$pos_2 = mb_strpos($value, ',');
if ($pos_1 && $pos_2) {
$value = mb_substr($value . '00', 0, $pos_1 + 3);
$value = str_replace(',', '', $value);
} elseif ($pos_1) {
$value = mb_substr($value . '00', 0, $pos_1 + 3);
} elseif ($pos_2) {
if ((mb_strlen($value) - $pos_2) == 3) {
$value = str_replace(',', '.', $value);
} else {
$value = str_replace(',', '', $value) . '.00';
}
} elseif (mb_strlen($value) == 0) {
return $default;
} else {
$value = $value . '.00';
}
return ($value == '0.00') ? 0 : $value;
}
/**
* Цена для массива.
*/
public static function priceArray($value, $default = 0)
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::price($row, $default);
}
return $res;
}
/**
* Цена для массива, результат объединённый в строку.
*/
public static function priceList($value, $default = 0, $separator = ',')
{
return implode($separator, self::priceArray($value, $default));
}
/**
* Текст.
*/
public static function text($value, $default = '')
{
$value = self::_prepare($value);
$value = str_ireplace(array("\t"), ' ', $value);
$value = preg_replace(array(
'@<\!--.*?-->@s',
'@\/\*(.*?)\*\/@sm',
'@<([\?\%]) .*? \\1>@sx',
'@<\!\[CDATA\[.*?\]\]>@sx',
'@<\!\[.*?\]>.*?<\!\[.*?\]>@sx',
'@\s--.*@',
'@<script[^>]*?>.*?</script>@si',
'@<style[^>]*?>.*?</style>@siU',
'@<[\/\!]*?[^<>]*?>@si',
), ' ', $value);
$value = strip_tags($value);
$value = str_replace(array('/*', '*/', ' --', '#__'), ' ', $value);
$value = mb_ereg_replace('[ ]+', ' ', $value);
$value = trim($value);
$value = htmlspecialchars($value, ENT_QUOTES);
return (mb_strlen($value) == 0) ? $default : $value;
}
/**
* Текст для массива.
*/
public static function textArray($value, $default = '')
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::text($row, $default);
}
return $res;
}
/**
* Текст для массива, результат объединённый в строку.
*/
public static function textList($value, $default = '', $separator = ',')
{
return implode($separator, self::textArray($value, $default));
}
/**
* Строка.
*/
public static function str($value, $default = '')
{
$value = self::text($value);
$value = str_ireplace(array("\r", "\n"), ' ', $value);
$value = mb_ereg_replace('[\s]+', ' ', $value);
$value = trim($value);
return (mb_strlen($value) == 0) ? $default : $value;
}
/**
* Строка для массива.
*/
public static function strArray($value, $default = '')
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::str($row, $default);
}
return $res;
}
/**
* Строка для массива, результат объединённый в строку.
*/
public static function strList($value, $default = '', $separator = ',')
{
return implode($separator, self::strArray($value, $default));
}
/**
* HTML.
*/
public static function html($value, $default = '')
{
$value = self::_prepare($value);
$value = mb_ereg_replace('[ ]+', ' ', $value);
$value = trim($value);
$value = addslashes($value);
return (mb_strlen($value) == 0) ? $default : $value;
}
/**
* HTML.
*/
public static function htmlArray($value, $default = '')
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::html($row, $default);
}
return $res;
}
/**
* ЧПУ.
*/
public static function sef($value, $default = '')
{
$value = self::str($value, '');
if (empty($value)) {
$value = $default;
}
$value = mb_strtolower($value);
$converter = array(
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
);
$value = strtr($value, $converter);
$value = mb_ereg_replace('[^-0-9a-z]', '-', $value);
$value = mb_ereg_replace('[-]+', '-', $value);
$value = trim($value, '-');
return $value;
}
/**
* ЧПУ для массива.
*/
public static function sefArray($value, $default = '')
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::sef($row, $default);
}
return $res;
}
/**
* ЧПУ для массива, результат объединённый в строку.
*/
public static function sefList($value, $default = '', $separator = ',')
{
return implode($separator, self::sefArray($value, $default));
}
/**
* Имя файла.
*/
public static function filename($value, $default = '')
{
$value = self::str($value, $default);
$value = str_replace(array('/', '|', '\\', '?', ':', ';', '\'', '"', '<', '>', '*'), '', $value);
$value = mb_ereg_replace('[.]+', '.', $value);
return (mb_strlen($value) == 0) ? $default : $value;
}
/**
* Имя файла для массива.
*/
public static function filenameArray($value, $default = '')
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::filename($row, $default);
}
return $res;
}
/**
* Имя файла для массива, результат объединённый в строку.
*/
public static function filenameList($value, $default = '', $separator = ',')
{
return implode($separator, self::filenameArray($value, $default));
}
/**
* Unix timestamp.
*/
public static function time($value, $default = 0)
{
$value = self::str($value, $default);
$value = strtotime($value);
return (empty($value)) ? $default : $value;
}
/**
* Unix timestamp для массива.
*/
public static function timeArray($value, $default = 0)
{
$res = array();
foreach ((array) $value as $row) {
$res[] = self::time($row, $default);
}
return $res;
}
/**
* Unix timestamp для массива, результат объединённый в строку.
*/
public static function timeList($value, $default = 0, $separator = ',')
{
return implode($separator, self::timeArray($value, $default));
}
}