Файл: sys/classes/text.class.php
Строк: 718
<?php
#Работа с текстом
class text {
static function password($pass) {
if (preg_match("#^[a-zа-яё0-9-_ ]{6,32}$#ui", $pass)) {
return true;
}
}
static function censure($s, $delta = 3, $continue = "xe2x80xa6") {
#предлоги русского языка:
#[всуо]|
#по|за|на|об|до|от|вы|вс|вз|из|ис|
#под|про|при|над|низ|раз|рас|воз|вос|
#пооб|повы|пона|поза|недо|пере|одно|
#полуза|произ|пораз|много|
static $pretext = array(
#1
'[уyоo]_? (?=[еёeхx])', #у, о (уебать, охуеть)
'[вvbсc]_? (?=[хпбмгжxpmgj])', #в, с (впиздячить, схуярить)
'[вvbсc]_?[ъь]_? (?=[еёe])', #въ, съ (съебаться, въебать)
'ё_? (?=[бb])', #ё (ёбля)
#2
'[вvb]_?[ыi]_?', #вы
'[зz3]_?[аa]_?', #за
'[нnh]_?[аaеeиi]_?', #на, не, ни
'[вvb]_?[сc]_? (?=[хпбмгжxpmgj])', #вс (вспизднуть)
'[оo]_?[тtбb]_? (?=[хпбмгжxpmgj])', #от, об
'[оo]_?[тtбb]_?[ъь]_? (?=[еёe])', #отъ, объ
'[иiвvb]_?[зz3]_? (?=[хпбмгжxpmgj])', #[ив]з
'[иiвvb]_?[зz3]_?[ъь]_? (?=[еёe])', #[ив]зъ
'[иi]_?[сc]_? (?=[хпбмгжxpmgj])', #ис
'[пpдdg]_?[оo]_? (?> [бb]_? (?=[хпбмгжxpmgj])
| [бb]_? [ъь]_? (?=[еёe])
| [зz3]_? [аa] _?
)?', #по, до, пообъ, дообъ, поза, доза (двойные символы вырезаются!)
#3
'[пp]_?[рr]_?[оoиi]_?', #пр[ои]
'[зz3]_?[лl]_?[оo]_?', #зло (злоебучая)
'[нnh]_?[аa]_?[дdg]_? (?=[хпбмгжxpmgj])', #над
'[нnh]_?[аa]_?[дdg]_?[ъь]_? (?=[еёe])', #надъ
'[пp]_?[оo]_?[дdg]_? (?=[хпбмгжxpmgj])', #под
'[пp]_?[оo]_?[дdg]_?[ъь]_? (?=[еёe])', #подъ
'[рr]_?[аa]_?[зz3сc]_? (?=[хпбмгжxpmgj])', #ра[зс]
'[рr]_?[аa]_?[зz3сc]_?[ъь]_? (?=[еёe])', #ра[зс]ъ
'[вvb]_?[оo]_?[зz3сc]_? (?=[хпбмгжxpmgj])', #во[зс]
'[вvb]_?[оo]_?[зz3сc]_?[ъь]_? (?=[еёe])', #во[зс]ъ
#4
'[нnh]_?[еe]_?[дdg]_?[оo]_?', #недо
'[пp]_?[еe]_?[рr]_?[еe]_?', #пере
'[oо]_?[дdg]_?[нnh]_?[оo]_?', #одно
'[кk]_?[oо]_?[нnh]_?[оo]_?', #коно (коноебиться)
'[мm]_?[уy]_?[дdg]_?[оoаa]_?', #муд[оа] (мудаёб)
'[oо]_?[сc]_?[тt]_?[оo]_?', #осто (остопиздело)
'[дdg]_?[уy]_?[рpr]_?[оoаa]_?', #дур[оа]
'[хx]_?[уy]_?[дdg]_?[оoаa]_?', #худ[оа] (худоебина)
#5
'[мm]_?[нnh]_?[оo]_?[гg]_?[оo]_?', #много
'[мm]_?[оo]_?[рpr]_?[дdg]_?[оoаa]_?', #морд[оа]
'[мm]_?[оo]_?[зz3]_?[гg]_?[оoаa]_?', #мозг[оа]
'[дdg]_?[оo]_?[лl]_?[бb6]_?[оoаa]_?', #долб[оа]
);
static $badwords = array(
#Слово на букву Х
'(?<=[_d]) {RE_PRETEXT}?
[hхx]_?[уyu]_?[йiеeёяюju] #хуй, хуя, хую, хуем, хуёвый
#исключения:
(?<! _hue(?=_) #HUE -- цветовая палитра
| _hue(?=so_) #hueso -- испанское слово
| _хуе(?=дин) #Хуедин -- город в Румынии
)',
#Слово на букву П
'(?<=[_d]) {RE_PRETEXT}?
[пp]_?[иi]_?[зz3]_?[дd]_?[:vowel:]', #пизда, пизде, пиздёж, пизду, пиздюлина, пиздобол, опиздинеть, пиздых
#Слово на букву Е
'(?<=[_d]) {RE_PRETEXT}?
[eеё]_? (?<!не[её]_) [бb6]_?(?: [уyиi]_ #ебу, еби
| [ыиiоoaаеeёуy]_?[:consonant:] #ебут, ебать, ебись, ебёт, поеботина, выебываться, ёбарь
| [лl][оoаaыиi] #ебло, ебла, ебливая, еблись, еблысь
| [нn]_?[уy] #ёбнул, ёбнутый
| [кk]_?[аa] #взъёбка
)',
'(?<=[_d]) {RE_PRETEXT}
(?<=[^_d][^_d]|[^_d]_[^_d]_) [eеё]_?[бb6] (?:_|_?[аa]_?[^_d])', #долбоёб, дураёб, изъёб, заёб, разъебай
#Слово на букву Б
'(?<=[_d]) {RE_PRETEXT}?
[бb6]_?[лl]_?(?:я|ya)(?: _ #бля
| _?[тд] #блять, бляди
)',
#ПИДОР
'(?<=[_d]) [пp]_?[иieе]_?[дdg]_?[eеaаoо]_?[rpр]', #п[ие]д[оеа]р
#МУДАК
'(?<=[_d]) [мm]_?[уy]_?[дdg]_?[аa]', #муда
#ЖОПА
'(?<=[_d]) [zж]_?h?_?[оo]_?[pп]_?[aаyуыiеeoо]', #жоп[ауыео]
#МАНДА
#исключения: город Мандалай, округ Мандаль, индейский народ Мандан, фамилия Мандель
'(?<=[_d]) [мm]_?[аa]_?[нnh]_?[дdg]_?[aаyуыiеeoо](?<! манда(?=[лн])|манде(?=ль ))', #манд[ауыео]
#ГОВНО
'(?<=[_d]) [гg]_?[оo]_?[вvb]_?[нnh]_?[оoаaяеeyу]', #говн[оаяеу]
#FUCK
'(?<=[_d]) f_?u_?[cс]_?k', #fuck
/*
#ЛОХ
' л_?[оo]_?[хx]',
#СУКА
'[^р]_?[scс]_?[yуu]_?[kк]_?[aаiи]', #сука (кроме слова "барсука" - это животное-грызун)
'[^р]_?[scс]_?[yуu]_?[4ч]_?[кk]', #сучк(и) (кроме слова "барсучка")
#ХЕР
' {RE_PRETEXT}?[хxh]_?[еe]_?[рpr](_?[нnh]_?(я|ya)| )', #{RE_PRETEXT}хер(ня)
#ЗАЛУПА
' [зz3]_?[аa]_?[лl]_?[уy]_?[пp]_?[аa]',
*/
);
static $re_trans = array(
'_' => 'x20', #пробел
'[:vowel:]' => '[аеиоуыэюяёaeioyu]', #гласные буквы
'[:consonant:]' => '[^аеиоуыэюяёaeioyux20d]', #согласные буквы
);
$re_badwords = str_replace('{RE_PRETEXT}', '(?>' . implode('|', $pretext) . ')', '~' . implode('|', $badwords) . '~sxu');
$re_badwords = strtr($re_badwords, $re_trans);
#вырезаем все лишнее
#скрипты не вырезаем, т.к. м.б. обходной маневр на с кодом на javascript:
#<script>document.write('сло'+'во')</script>
#хотя давать пользователю возможность использовать код на javascript нехорошо
$s = self::strip_tags_smart($s, null, true, array('comment', 'style', 'map', 'frameset', 'object', 'applet'));
#заменяем html-сущности в "чистый" UTF-8
$s = self::utf8_html_entity_decode($s, $is_htmlspecialchars = true);
$s = self::utf8_convert_case($s, CASE_LOWER);
static $trans = array(
"xc2xad" => '', #вырезаем "мягкий" перенос строки (­)
"xccx81" => '', #вырезаем знак ударения (U+0301 «combining acute accent»)
'/\' => 'л', #Б/Я
'/|' => 'л', #Б/|Я
"xd0xb5xd0xb5" => "xd0xb5xd1x91", #ее => её
);
$s = strtr($s, $trans);
#получаем в массив только буквы и цифры
#"с_л@о#во,сxc2xa7лово.Слово" -> "слово слово слово"
preg_match_all('/(?> xd0[xb0-xbf]|xd1[x80-x8fx91] #[а-я]
| [a-zd]+
)+
/sx', $s, $m);
$s = ' ' . implode(' ', $m[0]) . ' ';
#убираем все повторяющиеся символы
#"сллоооовоо слово" -> "слово слово"
$s = preg_replace('/( [xd0xd1][x80-xbf] #оптимизированное [а-я]
| [a-zd]
) \1+
/sx', '$1', $s);
#d($s);
if (preg_match($re_badwords, $s, $m, PREG_OFFSET_CAPTURE)) {
list($word, $offset) = $m[0];
$s1 = substr($s, 0, $offset);
$s2 = substr($s, $offset + strlen($word));
$delta = intval($delta);
if ($delta < 1 || $delta > 10)
$delta = 3;
preg_match('/ (?> x20 (?>[xd0xd1][x80-xbf]|[a-zd]+)+ ){1,' . $delta . '}
x20?
$/sx', $s1, $m1);
preg_match('/^ (?>[xd0xd1][x80-xbf]|[a-zd]+)* #окончание
x20?
(?> (?>[xd0xd1][x80-xbf]|[a-zd]+)+ x20 ){1,' . $delta . '}
/sx', $s2, $m2);
$fragment = (ltrim(@$m1[0]) !== ltrim($s1) ? $continue : '') .
trim(@$m1[0] . '[' . trim($word) . ']' . @$m2[0]) .
(rtrim(@$m2[0]) !== rtrim($s2) ? $continue : '');
return $fragment;
}
return false;
}
static function utf8_convert_case($s, $mode) {
#таблица конвертации регистра
static $trans = array(
#CASE_UPPER => CASE_LOWER
#en (английский латиница)
"x41" => "x61", #a
"x42" => "x62", #b
"x43" => "x63", #c
"x44" => "x64", #d
"x45" => "x65", #e
"x46" => "x66", #f
"x47" => "x67", #g
"x48" => "x68", #h
"x49" => "x69", #i
"x4a" => "x6a", #j
"x4b" => "x6b", #k
"x4c" => "x6c", #l
"x4d" => "x6d", #m
"x4e" => "x6e", #n
"x4f" => "x6f", #o
"x50" => "x70", #p
"x51" => "x71", #q
"x52" => "x72", #r
"x53" => "x73", #s
"x54" => "x74", #t
"x55" => "x75", #u
"x57" => "x77", #w
"x56" => "x76", #v
"x58" => "x78", #x
"x59" => "x79", #y
"x5a" => "x7a", #z
#ru (русский кириллица)
"xd0x81" => "xd1x91", #ё
"xd0x90" => "xd0xb0", #а
"xd0x91" => "xd0xb1", #б
"xd0x92" => "xd0xb2", #в
"xd0x93" => "xd0xb3", #г
"xd0x94" => "xd0xb4", #д
"xd0x95" => "xd0xb5", #е
"xd0x96" => "xd0xb6", #ж
"xd0x97" => "xd0xb7", #з
"xd0x98" => "xd0xb8", #и
"xd0x99" => "xd0xb9", #й
"xd0x9a" => "xd0xba", #к
"xd0x9b" => "xd0xbb", #л
"xd0x9c" => "xd0xbc", #м
"xd0x9d" => "xd0xbd", #н
"xd0x9e" => "xd0xbe", #о
"xd0x9f" => "xd0xbf", #п
"xd0xa0" => "xd1x80", #р
"xd0xa1" => "xd1x81", #с
"xd0xa2" => "xd1x82", #т
"xd0xa3" => "xd1x83", #у
"xd0xa4" => "xd1x84", #ф
"xd0xa5" => "xd1x85", #х
"xd0xa6" => "xd1x86", #ц
"xd0xa7" => "xd1x87", #ч
"xd0xa8" => "xd1x88", #ш
"xd0xa9" => "xd1x89", #щ
"xd0xaa" => "xd1x8a", #ъ
"xd0xab" => "xd1x8b", #ы
"xd0xac" => "xd1x8c", #ь
"xd0xad" => "xd1x8d", #э
"xd0xae" => "xd1x8e", #ю
"xd0xaf" => "xd1x8f", #я
#tt (татарский, башкирский кириллица)
"xd2x96" => "xd2x97", #ж с хвостиком Җ => җ
"xd2xa2" => "xd2xa3", #н с хвостиком Ң => ң
"xd2xae" => "xd2xaf", #y Ү => ү
"xd2xba" => "xd2xbb", #h мягкое Һ => һ
"xd3x98" => "xd3x99", #э Ә => ә
"xd3xa8" => "xd3xa9", #o перечеркнутое Ө => ө
#uk (украинский кириллица)
"xd2x90" => "xd2x91", #г с хвостиком
"xd0x84" => "xd1x94", #э зеркальное отражение
"xd0x86" => "xd1x96", #и с одной точкой
"xd0x87" => "xd1x97", #и с двумя точками
#be (белорусский кириллица)
"xd0x8e" => "xd1x9e", #у с подковой над буквой
#tr,de,es (турецкий, немецкий, испанский, французский латиница)
"xc3x84" => "xc3xa4", #a умляут Ä => ä (турецкий)
"xc3x87" => "xc3xa7", #c с хвостиком Ç => ç (турецкий, французский)
"xc3x91" => "xc3xb1", #n с тильдой Ñ => ñ (турецкий, испанский)
"xc3x96" => "xc3xb6", #o умляут Ö => ö (турецкий)
"xc3x9c" => "xc3xbc", #u умляут Ü => ü (турецкий, французский)
"xc4x9e" => "xc4x9f", #g умляут Ğ => ğ (турецкий)
"xc4xb0" => "xc4xb1", #i c точкой и без İ => ı (турецкий)
"xc5x9e" => "xc5x9f", #s с хвостиком Ş => ş (турецкий)
#hr (хорватский латиница)
"xc4x8c" => "xc4x8d", #c с подковой над буквой
"xc4x86" => "xc4x87", #c с ударением
"xc4x90" => "xc4x91", #d перечеркнутое
"xc5xa0" => "xc5xa1", #s с подковой над буквой
"xc5xbd" => "xc5xbe", #z с подковой над буквой
#fr (французский латиница)
"xc3x80" => "xc3xa0", #a с ударением в др. сторону
"xc3x82" => "xc3xa2", #a с крышкой
"xc3x86" => "xc3xa6", #ae совмещенное
"xc3x88" => "xc3xa8", #e с ударением в др. сторону
"xc3x89" => "xc3xa9", #e с ударением
"xc3x8a" => "xc3xaa", #e с крышкой
"xc3x8b" => "xc3xab", #ё
"xc3x8e" => "xc3xae", #i с крышкой
"xc3x8f" => "xc3xaf", #i умляут
"xc3x94" => "xc3xb4", #o с крышкой
"xc5x92" => "xc5x93", #ce совмещенное
"xc3x99" => "xc3xb9", #u с ударением в др. сторону
"xc3x9b" => "xc3xbb", #u с крышкой
"xc5xb8" => "xc3xbf", #y умляут
#xx (другой язык)
#"" => "", #
);
#d($trans);
#вариант с str_replace() должен работать быстрее, чем с strtr()
if ($mode == CASE_UPPER) {
if (function_exists('mb_strtoupper')) {
return mb_strtoupper($s, 'utf-8');
}
if (preg_match('/^[x00-x7e]*$/', $s)) {
return strtoupper($s);
}
#может, так быстрее? (:TODO:)
strtr($s, array_flip($trans));
#$s = str_replace(array_values($trans), array_keys($trans), $s);
} elseif ($mode == CASE_LOWER) {
if (function_exists('mb_strtolower')) {
return mb_strtolower($s, 'utf-8');
}
if (preg_match('/^[x00-x7e]*$/', $s)) {
return strtolower($s);
}
#может, так быстрее? (:TODO:)
strtr($s, $trans);
#$s = str_replace(array_keys($trans), array_values($trans), $s);
} else {
trigger_error('Parameter 2 should be a constant of CASE_LOWER or CASE_UPPER!', E_USER_WARNING);
return $s;
}
return $s;
}
static function utf8_lowercase($s) {
return self::utf8_convert_case($s, CASE_LOWER);
}
static function utf8_uppercase($s) {
return self::utf8_convert_case($s, CASE_UPPER);
}
static function utf8_html_entity_decode($s, $is_htmlspecialchars = false) {
#оптимизация скорости
if (strlen($s) < 4 #по минимальной длине сущности - 4 байта: &#d; &xx;
|| ($pos = strpos($s, '&') === false) || strpos($s, ';', $pos) === false)
return $s;
$table = array(
#Latin-1 Entities:
' ' => "xc2xa0", #no-break space = non-breaking space
'¡' => "xc2xa1", #inverted exclamation mark
'¢' => "xc2xa2", #cent sign
'£' => "xc2xa3", #pound sign
'¤' => "xc2xa4", #currency sign
'¥' => "xc2xa5", #yen sign = yuan sign
'¦' => "xc2xa6", #broken bar = broken vertical bar
'§' => "xc2xa7", #section sign
'¨' => "xc2xa8", #diaeresis = spacing diaeresis
'©' => "xc2xa9", #copyright sign
'ª' => "xc2xaa", #feminine ordinal indicator
'«' => "xc2xab", #left-pointing double angle quotation mark = left pointing guillemet («)
'¬' => "xc2xac", #not sign
'­' => "xc2xad", #soft hyphen = discretionary hyphen
'®' => "xc2xae", #registered sign = registered trade mark sign
'¯' => "xc2xaf", #macron = spacing macron = overline = APL overbar
'°' => "xc2xb0", #degree sign
'±' => "xc2xb1", #plus-minus sign = plus-or-minus sign
'²' => "xc2xb2", #superscript two = superscript digit two = squared
'³' => "xc2xb3", #superscript three = superscript digit three = cubed
'´' => "xc2xb4", #acute accent = spacing acute
'µ' => "xc2xb5", #micro sign
'¶' => "xc2xb6", #pilcrow sign = paragraph sign
'·' => "xc2xb7", #middle dot = Georgian comma = Greek middle dot
'¸' => "xc2xb8", #cedilla = spacing cedilla
'¹' => "xc2xb9", #superscript one = superscript digit one
'º' => "xc2xba", #masculine ordinal indicator
'»' => "xc2xbb", #right-pointing double angle quotation mark = right pointing guillemet (»)
'¼' => "xc2xbc", #vulgar fraction one quarter = fraction one quarter
'½' => "xc2xbd", #vulgar fraction one half = fraction one half
'¾' => "xc2xbe", #vulgar fraction three quarters = fraction three quarters
'¿' => "xc2xbf", #inverted question mark = turned question mark
#Latin capital letter
'À' => "xc3x80", #Latin capital letter A with grave = Latin capital letter A grave
'Á' => "xc3x81", #Latin capital letter A with acute
'Â' => "xc3x82", #Latin capital letter A with circumflex
'Ã' => "xc3x83", #Latin capital letter A with tilde
'Ä' => "xc3x84", #Latin capital letter A with diaeresis
'Å' => "xc3x85", #Latin capital letter A with ring above = Latin capital letter A ring
'Æ' => "xc3x86", #Latin capital letter AE = Latin capital ligature AE
'Ç' => "xc3x87", #Latin capital letter C with cedilla
'È' => "xc3x88", #Latin capital letter E with grave
'É' => "xc3x89", #Latin capital letter E with acute
'Ê' => "xc3x8a", #Latin capital letter E with circumflex
'Ë' => "xc3x8b", #Latin capital letter E with diaeresis
'Ì' => "xc3x8c", #Latin capital letter I with grave
'Í' => "xc3x8d", #Latin capital letter I with acute
'Î' => "xc3x8e", #Latin capital letter I with circumflex
'Ï' => "xc3x8f", #Latin capital letter I with diaeresis
'Ð' => "xc3x90", #Latin capital letter ETH
'Ñ' => "xc3x91", #Latin capital letter N with tilde
'Ò' => "xc3x92", #Latin capital letter O with grave
'Ó' => "xc3x93", #Latin capital letter O with acute
'Ô' => "xc3x94", #Latin capital letter O with circumflex
'Õ' => "xc3x95", #Latin capital letter O with tilde
'Ö' => "xc3x96", #Latin capital letter O with diaeresis
'×' => "xc3x97", #multiplication sign
'Ø' => "xc3x98", #Latin capital letter O with stroke = Latin capital letter O slash
'Ù' => "xc3x99", #Latin capital letter U with grave
'Ú' => "xc3x9a", #Latin capital letter U with acute
'Û' => "xc3x9b", #Latin capital letter U with circumflex
'Ü' => "xc3x9c", #Latin capital letter U with diaeresis
'Ý' => "xc3x9d", #Latin capital letter Y with acute
'Þ' => "xc3x9e", #Latin capital letter THORN
#Latin small letter
'ß' => "xc3x9f", #Latin small letter sharp s = ess-zed
'à' => "xc3xa0", #Latin small letter a with grave = Latin small letter a grave
'á' => "xc3xa1", #Latin small letter a with acute
'â' => "xc3xa2", #Latin small letter a with circumflex
'ã' => "xc3xa3", #Latin small letter a with tilde
'ä' => "xc3xa4", #Latin small letter a with diaeresis
'å' => "xc3xa5", #Latin small letter a with ring above = Latin small letter a ring
'æ' => "xc3xa6", #Latin small letter ae = Latin small ligature ae
'ç' => "xc3xa7", #Latin small letter c with cedilla
'è' => "xc3xa8", #Latin small letter e with grave
'é' => "xc3xa9", #Latin small letter e with acute
'ê' => "xc3xaa", #Latin small letter e with circumflex
'ë' => "xc3xab", #Latin small letter e with diaeresis
'ì' => "xc3xac", #Latin small letter i with grave
'í' => "xc3xad", #Latin small letter i with acute
'î' => "xc3xae", #Latin small letter i with circumflex
'ï' => "xc3xaf", #Latin small letter i with diaeresis
'ð' => "xc3xb0", #Latin small letter eth
'ñ' => "xc3xb1", #Latin small letter n with tilde
'ò' => "xc3xb2", #Latin small letter o with grave
'ó' => "xc3xb3", #Latin small letter o with acute
'ô' => "xc3xb4", #Latin small letter o with circumflex
'õ' => "xc3xb5", #Latin small letter o with tilde
'ö' => "xc3xb6", #Latin small letter o with diaeresis
'÷' => "xc3xb7", #division sign
'ø' => "xc3xb8", #Latin small letter o with stroke = Latin small letter o slash
'ù' => "xc3xb9", #Latin small letter u with grave
'ú' => "xc3xba", #Latin small letter u with acute
'û' => "xc3xbb", #Latin small letter u with circumflex
'ü' => "xc3xbc", #Latin small letter u with diaeresis
'ý' => "xc3xbd", #Latin small letter y with acute
'þ' => "xc3xbe", #Latin small letter thorn
'ÿ' => "xc3xbf", #Latin small letter y with diaeresis
#Symbols and Greek Letters:
'ƒ' => "xc6x92", #Latin small f with hook = function = florin
'Α' => "xcex91", #Greek capital letter alpha
'Β' => "xcex92", #Greek capital letter beta
'Γ' => "xcex93", #Greek capital letter gamma
'Δ' => "xcex94", #Greek capital letter delta
'Ε' => "xcex95", #Greek capital letter epsilon
'Ζ' => "xcex96", #Greek capital letter zeta
'Η' => "xcex97", #Greek capital letter eta
'Θ' => "xcex98", #Greek capital letter theta
'Ι' => "xcex99", #Greek capital letter iota
'Κ' => "xcex9a", #Greek capital letter kappa
'Λ' => "xcex9b", #Greek capital letter lambda
'Μ' => "xcex9c", #Greek capital letter mu
'Ν' => "xcex9d", #Greek capital letter nu
'Ξ' => "xcex9e", #Greek capital letter xi
'Ο' => "xcex9f", #Greek capital letter omicron
'Π' => "xcexa0", #Greek capital letter pi
'Ρ' => "xcexa1", #Greek capital letter rho
'Σ' => "xcexa3", #Greek capital letter sigma
'Τ' => "xcexa4", #Greek capital letter tau
'Υ' => "xcexa5", #Greek capital letter upsilon
'Φ' => "xcexa6", #Greek capital letter phi
'Χ' => "xcexa7", #Greek capital letter chi
'Ψ' => "xcexa8", #Greek capital letter psi
'Ω' => "xcexa9", #Greek capital letter omega
'α' => "xcexb1", #Greek small letter alpha
'β' => "xcexb2", #Greek small letter beta
'γ' => "xcexb3", #Greek small letter gamma
'δ' => "xcexb4", #Greek small letter delta
'ε' => "xcexb5", #Greek small letter epsilon
'ζ' => "xcexb6", #Greek small letter zeta
'η' => "xcexb7", #Greek small letter eta
'θ' => "xcexb8", #Greek small letter theta
'ι' => "xcexb9", #Greek small letter iota
'κ' => "xcexba", #Greek small letter kappa
'λ' => "xcexbb", #Greek small letter lambda
'μ' => "xcexbc", #Greek small letter mu
'ν' => "xcexbd", #Greek small letter nu
'ξ' => "xcexbe", #Greek small letter xi
'ο' => "xcexbf", #Greek small letter omicron
'π' => "xcfx80", #Greek small letter pi
'ρ' => "xcfx81", #Greek small letter rho
'ς' => "xcfx82", #Greek small letter final sigma
'σ' => "xcfx83", #Greek small letter sigma
'τ' => "xcfx84", #Greek small letter tau
'υ' => "xcfx85", #Greek small letter upsilon
'φ' => "xcfx86", #Greek small letter phi
'χ' => "xcfx87", #Greek small letter chi
'ψ' => "xcfx88", #Greek small letter psi
'ω' => "xcfx89", #Greek small letter omega
'ϑ' => "xcfx91", #Greek small letter theta symbol
'ϒ' => "xcfx92", #Greek upsilon with hook symbol
'ϖ' => "xcfx96", #Greek pi symbol
'•' => "xe2x80xa2", #bullet = black small circle
'…' => "xe2x80xa6", #horizontal ellipsis = three dot leader
'′' => "xe2x80xb2", #prime = minutes = feet (для обозначения минут и футов)
'″' => "xe2x80xb3", #double prime = seconds = inches (для обозначения секунд и дюймов).
'‾' => "xe2x80xbe", #overline = spacing overscore
'⁄' => "xe2x81x84", #fraction slash
'℘' => "xe2x84x98", #script capital P = power set = Weierstrass p
'ℑ' => "xe2x84x91", #blackletter capital I = imaginary part
'ℜ' => "xe2x84x9c", #blackletter capital R = real part symbol
'™' => "xe2x84xa2", #trade mark sign
'ℵ' => "xe2x84xb5", #alef symbol = first transfinite cardinal
'←' => "xe2x86x90", #leftwards arrow
'↑' => "xe2x86x91", #upwards arrow
'→' => "xe2x86x92", #rightwards arrow
'↓' => "xe2x86x93", #downwards arrow
'↔' => "xe2x86x94", #left right arrow
'↵' => "xe2x86xb5", #downwards arrow with corner leftwards = carriage return
'⇐' => "xe2x87x90", #leftwards double arrow
'⇑' => "xe2x87x91", #upwards double arrow
'⇒' => "xe2x87x92", #rightwards double arrow
'⇓' => "xe2x87x93", #downwards double arrow
'⇔' => "xe2x87x94", #left right double arrow
'∀' => "xe2x88x80", #for all
'∂' => "xe2x88x82", #partial differential
'∃' => "xe2x88x83", #there exists
'∅' => "xe2x88x85", #empty set = null set = diameter
'∇' => "xe2x88x87", #nabla = backward difference
'∈' => "xe2x88x88", #element of
'∉' => "xe2x88x89", #not an element of
'∋' => "xe2x88x8b", #contains as member
'∏' => "xe2x88x8f", #n-ary product = product sign
'∑' => "xe2x88x91", #n-ary sumation
'−' => "xe2x88x92", #minus sign
'∗' => "xe2x88x97", #asterisk operator
'√' => "xe2x88x9a", #square root = radical sign
'∝' => "xe2x88x9d", #proportional to
'∞' => "xe2x88x9e", #infinity
'∠' => "xe2x88xa0", #angle
'∧' => "xe2x88xa7", #logical and = wedge
'∨' => "xe2x88xa8", #logical or = vee
'∩' => "xe2x88xa9", #intersection = cap
'∪' => "xe2x88xaa", #union = cup
'∫' => "xe2x88xab", #integral
'∴' => "xe2x88xb4", #therefore
'∼' => "xe2x88xbc", #tilde operator = varies with = similar to
'≅' => "xe2x89x85", #approximately equal to
'≈' => "xe2x89x88", #almost equal to = asymptotic to
'≠' => "xe2x89xa0", #not equal to
'≡' => "xe2x89xa1", #identical to
'≤' => "xe2x89xa4", #less-than or equal to
'≥' => "xe2x89xa5", #greater-than or equal to
'⊂' => "xe2x8ax82", #subset of
'⊃' => "xe2x8ax83", #superset of
'⊄' => "xe2x8ax84", #not a subset of
'⊆' => "xe2x8ax86", #subset of or equal to
'⊇' => "xe2x8ax87", #superset of or equal to
'⊕' => "xe2x8ax95", #circled plus = direct sum
'⊗' => "xe2x8ax97", #circled times = vector product
'⊥' => "xe2x8axa5", #up tack = orthogonal to = perpendicular
'⋅' => "xe2x8bx85", #dot operator
'⌈' => "xe2x8cx88", #left ceiling = APL upstile
'⌉' => "xe2x8cx89", #right ceiling
'⌊' => "xe2x8cx8a", #left floor = APL downstile
'⌋' => "xe2x8cx8b", #right floor
'⟨' => "xe2x8cxa9", #left-pointing angle bracket = bra
'⟩' => "xe2x8cxaa", #right-pointing angle bracket = ket
'◊' => "xe2x97x8a", #lozenge
'♠' => "xe2x99xa0", #black spade suit
'♣' => "xe2x99xa3", #black club suit = shamrock
'♥' => "xe2x99xa5", #black heart suit = valentine
'♦' => "xe2x99xa6", #black diamond suit
#Other Special Characters:
'Œ' => "xc5x92", #Latin capital ligature OE
'œ' => "xc5x93", #Latin small ligature oe
'Š' => "xc5xa0", #Latin capital letter S with caron
'š' => "xc5xa1", #Latin small letter s with caron
'Ÿ' => "xc5xb8", #Latin capital letter Y with diaeresis
'ˆ' => "xcbx86", #modifier letter circumflex accent
'˜' => "xcbx9c", #small tilde
' ' => "xe2x80x82", #en space
' ' => "xe2x80x83", #em space
' ' => "xe2x80x89", #thin space
'‌' => "xe2x80x8c", #zero width non-joiner
'‍' => "xe2x80x8d", #zero width joiner
'‎' => "xe2x80x8e", #left-to-right mark
'‏' => "xe2x80x8f", #right-to-left mark
'–' => "xe2x80x93", #en dash
'—' => "xe2x80x94", #em dash
'‘' => "xe2x80x98", #left single quotation mark
'’' => "xe2x80x99", #right single quotation mark (and apostrophe!)
'‚' => "xe2x80x9a", #single low-9 quotation mark
'“' => "xe2x80x9c", #left double quotation mark
'”' => "xe2x80x9d", #right double quotation mark
'„' => "xe2x80x9e", #double low-9 quotation mark
'†' => "xe2x80xa0", #dagger
'‡' => "xe2x80xa1", #double dagger
'‰' => "xe2x80xb0", #per mille sign
'‹' => "xe2x80xb9", #single left-pointing angle quotation mark
'›' => "xe2x80xba", #single right-pointing angle quotation mark
'€' => "xe2x82xac", #euro sign
);
$htmlspecialchars = array(
'"' => "x22", #quotation mark = APL quote (") "
'&' => "x26", #ampersand (&) &
'<' => "x3c", #less-than sign (<) <
'>' => "x3e", #greater-than sign (>) >
);
if ($is_htmlspecialchars)
$table += $htmlspecialchars;
#заменяем именованные сущности:
#оптимизация скорости: заменяем только те сущности, которые используются в html коде!
#эта часть кода работает быстрее, чем $s = strtr($s, $table);
preg_match_all('/&[a-zA-Z]+d*;/s', $s, $m, null, $pos);
foreach (array_unique($m[0]) as $entity) {
if (array_key_exists($entity, $table))
$s = str_replace($entity, $table[$entity], $s);
}#foreach
if (($pos = strpos($s, '&#')) !== false) { #speed optimization
#заменяем числовые dec и hex сущности:
$htmlspecialchars_flip = array_flip($htmlspecialchars);
$s = preg_replace(
'/&#((x)[da-fA-F]{2,4}|d{1,4});/se', '(array_key_exists($a = pack("C", $d = ("$2") ? hexdec("$1") : "$1"), $htmlspecialchars_flip) && ! $is_htmlspecialchars) ?
$htmlspecialchars_flip[$a] :
iconv("UCS-2BE", "UTF-8", pack("n", $d))', $s, -1, $pos);
}
return $s;
}
static function strip_tags_smart(
/* string */ $s, array $allowable_tags = null,
/* boolean */ $is_format_spaces = false, array $pair_tags = array('script', 'style', 'map', 'iframe', 'frameset', 'object', 'applet', 'comment', 'button'), array $para_tags = array('p', 'td', 'th', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'form', 'title')
) {
static $_callback_type = false;
static $_allowable_tags = array();
static $_para_tags = array();
#регулярное выражение для атрибутов тагов
#корректно обрабатывает грязный и битый HTML в однобайтовой или UTF-8 кодировке!
static $re_attrs_fast_safe = '(?> (?>[x20rnt]+|xc2xa0)+ #пробельные символы (д.б. обязательно)
(?>
#правильные атрибуты
[^>"']+
| (?<=[=x20rnt]|xc2xa0) "[^"]*"
| (?<=[=x20rnt]|xc2xa0) '[^']*'
#разбитые атрибуты
| [^>]+
)*
)?';
if (is_array($s) && $_callback_type === 'strip_tags') {
$tag = strtolower($s[1]);
if ($_allowable_tags &&
(array_key_exists($tag, $_allowable_tags) || array_key_exists('<' . trim(strtolower($s[0]), '< />') . '>', $_allowable_tags))
)
return $s[0];
if ($tag == 'br')
return "rn";
if ($_para_tags && array_key_exists($tag, $_para_tags))
return "rnrn";
return '';
}
if (($pos = strpos($s, '<') === false) || strpos($s, '>', $pos) === false) { #оптимизация скорости
#таги не найдены
return $s;
}
#непарные таги (открывающие, закрывающие, !DOCTYPE, MS Word namespace)
$re_tags = '/<[/!]? ([a-zA-Z][a-zA-Zd]* (?>:[a-zA-Z][a-zA-Zd]*)?)' . $re_attrs_fast_safe . '/?>/sx';
$patterns = array(
'/<([?%]) .*? \1>/sx', #встроенный PHP, Perl, ASP код
'/<![CDATA[ .*? ]]>/sx', #блоки CDATA
#'/<![ [x20rnt]* [a-zA-Z] .*? ]>/sx', #:DEPRECATED: MS Word таги типа <![if! vml]>...<![endif]>
'/<!--.*?-->/s', #комментарии
#MS Word таги типа "<![if! vml]>...<![endif]>",
#условное выполнение кода для IE типа "<!--[if expression]> HTML <![endif]-->"
#условное выполнение кода для IE типа "<![if expression]> HTML <![endif]>"
#см. http://www.tigir.com/comments.htm
'/<! (?>--)?
[
(?> [^]"']+ | "[^"]*" | '[^']*' )*
]
(?>--)?
>/sx',
);
if ($pair_tags) {
#парные таги вместе с содержимым:
foreach ($pair_tags as $k => $v)
$pair_tags[$k] = preg_quote($v, '/');
$patterns[] = '/<((?i:' . implode('|', $pair_tags) . '))' . $re_attrs_fast_safe . '> .*? </(?i:\1)' . $re_attrs_fast_safe . '>/sx';
}
#d($patterns);
$i = 0; #защита от зацикливания
$max = 99;
while ($i < $max) {
$s2 = preg_replace($patterns, '', $s);
if ($i == 0) {
$is_html = ($s2 != $s || preg_match($re_tags, $s2));
if ($is_html) {
#В библиотеке PCRE для PHP s - это любой пробельный символ, а именно класс символов [x09x0ax0cx0dx20xa0] или, по другому, [tnfr xa0]
#Если s используется с модификатором /u, то s трактуется как [x09x0ax0cx0dx20]
#Браузер не делает различия между пробельными символами,
#друг за другом подряд идущие символы воспринимаются как один
#$s = str_replace(array("r", "n", "t"), ' ', $s);
$s2 = strtr($s2, "x09x0ax0cx0d", ' ');
#массив тагов, которые не будут вырезаны
if ($allowable_tags)
$_allowable_tags = array_flip($allowable_tags);
#парные таги, которые будут восприниматься как параграфы
if ($para_tags)
$_para_tags = array_flip($para_tags);
}
}#if
#обработка тагов
if ($is_html) {
$_callback_type = 'strip_tags';
$s2 = preg_replace_callback($re_tags, __FUNCTION__, $s2);
$_callback_type = false;
}
if ($s === $s2)
break;
$s = $s2;
$i++;
}#while
if ($i >= $max)
$s = strip_tags($s);#too many cycles for replace...
if ($is_format_spaces || $is_html) {
#вырезаем дублирующие пробелы
$s = preg_replace('/x20x20+/s', ' ', trim($s));
#вырезаем пробелы в начале и в конце строк
$s = str_replace(array("rnx20", "x20rn"), "rn", $s);
#заменяем 2 и более переносов строк на 2 переноса строк
$s = preg_replace('/rn[rn]+/s', "rnrn", $s);
}
return $s;
}
#антимат сделает автоматическое предупреждение, а затем бан
static function antimat($str) {
global $user, $time, $set;
if ($set['antimat']) {
$antimat = empty($_SESSION['antimat']) ? null : $_SESSION['antimat'];
$censure = self::censure($str);
if ($censure) {
$antimat[$censure] = $time;
if (count($antimat) > 3 and isset($user) and $user['level'] == 0) { #если сделано больше 3-х предупреждений
$prich = "Обнаружен мат: $censure";
$timeban = $time + 60 * 60; // бан на час
mysql_query("INSERT INTO `ban` (`id_user`, `id_ban`, `prich`, `time`) VALUES ('$user[id]', '0', '$prich', '$timeban')");
admin_log('Пользователи', 'Бан', "Бан пользователя '[url=/panel/ban.php?id=$user[id]]$user[nick][/url]' (id#$user[id]) до " . date::time($timeban) . " по причине '$prich'");
header('Location: /ban.php?' . SID);
exit;
}
return $censure;
} else {
return false;
}
} else {
return false;
}
}
static function extract16color($color16) {
$mask16 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
$color_mask = array("r", "g", "b");
$true_color = array(
"r" => 0,
"g" => 0,
"b" => 0);
$color16 = substr($color16, 1);
for ($icm = 0; $icm < count($color_mask); $icm++) {
$color16_temp = array(substr($color16, ($icm * 2), 1), substr($color16, ($icm * 2) + 1, 1));
for ($ic = 0; $ic < 2; $ic++) {
for ($i = 0; $i < count($mask16); $i++) {
if ($color16_temp[$ic] == $mask16[$i]) {
$color16_temp[$ic] = $i;
break;
}
}
}
$true_color[$color_mask[$icm]] = ((int) $color16_temp[0] * 16) + (int) $color16_temp[1];
}
return $true_color;
}
static function make16color($color10) {
$mask16 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
$color_mask = array("r", "g", "b");
$true_color = "#";
for ($icm = 0; $icm < count($color_mask); $icm++) {
$color10_temp = (int) $color10[$color_mask[$icm]];
$true_color .= $mask16[(int) ($color10_temp / 16)];
$true_color .= $mask16[$color10_temp % 16];
}
return $true_color;
}
static function gradient($text, $sColor, $eColor) {
$color_mask = array("r", "g", "b");
$color_move = array(
"r" => 0,
"g" => 0,
"b" => 0);
$color_add = array(
"r" => 0,
"g" => 0,
"b" => 0);
$word = array();
$length = strlen($text);
$output = "";
$Gzip = "";
$current_color = "";
$max = 0;
if ($length > 0) {
$sColor = self::extract16color($sColor);
$eColor = self::extract16color($eColor);
$cColor = $sColor;
for ($i = 0; $i < count($color_mask); $i++) {
$temp = $sColor[$color_mask[$i]] - $eColor[$color_mask[$i]];
$color_add[$color_mask[$i]] = abs($temp);
if (abs($temp) > $max) {
$max = abs($temp);
}
if ($temp < 0) {
$color_move[$color_mask[$i]] = 1;
} else if ($temp > 0) {
$color_move[$color_mask[$i]] = - 1;
} else {
$color_move[$color_mask[$i]] = 0;
}
}
for ($i = 0; $i < $length; $i++) {
$char = substr($text, $i, 1);
$test = ord($char);
if ($test >= 128 and $test <= 255 | $test = "") {
$char = substr($text, $i, 2);
$i++;
}
$word[] = $char;
}
}
$length = count($word);
$koeff_add = @(($max / $length) / $max) * 100;
for ($i = 0; $i < $length; $i++) {
for ($i2 = 0; $i2 < count($color_mask); $i2++) {
$add = (($color_add[$color_mask[$i2]] / 100) * $koeff_add) * $color_move[$color_mask[$i2]];
$cColor[$color_mask[$i2]] += $add;
}
$current_color = self::make16color($cColor);
if (!$i) {
$output .= '<font color = "' . $current_color . '">' . $word[$i];
$Gzip = $current_color;
} else {
if ($current_color == $Gzip | $word[$i] == " ") {
$output .= $word[$i];
} else {
$output .= '</font><font color = "' . $current_color . '">' . $word[$i];
$Gzip = $current_color;
}
}
}
if (strlen($output)) {
$output .= "</font>";
}
return $output;
}
static function smiles($msg) {
$q = mysql_query("SELECT * FROM `smiles_spis`");
while ($post = mysql_fetch_array($q)) {
$msg = str_replace($post['sim'], "<img src = '/style/icons/smiles/$post[name].png' alt = '$post[name]' />", $msg);
}
return $msg;
}
static function cut_text($text, $maxwords = 10, $maxchar = 30) {
$sep = ' ';
$words = @preg_split(" ", $text);
$char = iconv_strlen($text, 'utf-8');
if (count($words) > $maxwords) {
$text = join($sep, array_slice($words, 0, $maxwords));
}
return $text;
}
#Получение подстроки
static function substr($text, $len, $start = 0, $mn = ' (...)') {
$text = trim($text);
if (function_exists('mb_substr')) {
return mb_substr($text, $start, $len) . (mb_strlen($text) > $len - $start ? $mn : null);
}
if (function_exists('iconv')) {
return iconv_substr($text, $start, $len) . (iconv_strlen($text) > $len - $start ? $mn : null);
}
return $text;
}
#Фильтрация текста с ограничением длины в зависимости от типа браузера.
static function for_opis($text) {
$text = self::substr($text, IS_WEB == 'web' ? 1000 : 300);
$text = self::toOutput($text);
return $text;
}
static function toOutput($str, $br = 1, $html = 1, $smiles = 1, $links = 1, $bbcode = 1) {
// преобразуем все к нормальному перевариванию браузером
if ($html) {
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
}
// вставка смайлов
if ($smiles) {
$str = self::smiles($str);
}
// обработка ссылок
if ($links) {
$str = links($str);
}
// обработка bbcode
if ($bbcode) {
$tmp_str = $str;
$str = bbcode($str);
}
// переносы строк
if ($br) {
$str = self::br($str);
}
$str = self::output_add($str);
// возвращаем обработанную строку
return stripslashes($str);
}
#вспомогательная функция дополнительных фильтраций текста
static function output_add($text) {
//байт разворота
$text = str_replace(chr(226) . chr(128) . chr(174), '.', $text);
//одна из не очень популярных xss но считается давольно вредной
$text = str_replace(array('̏', '͓'), null, $text);
return $text;
}
# переносы строк
static function br($msg, $br = '<br />') {
return preg_replace("#((<br( ?/?)>)|n|r)+#i", $br, $msg);
}
# Вырезает все нечитаемые символы
static function esc($text, $br = NULL) {
if ($br != NULL) {
for ($i = 0; $i <= 31; $i++) {
$text = str_replace(chr($i), NULL, $text);
}
} else {
for ($i = 0; $i < 10; $i++) {
$text = str_replace(chr($i), NULL, $text);
}
for ($i = 11; $i < 20; $i++) {
$text = str_replace(chr($i), NULL, $text);
}
for ($i = 21; $i <= 31; $i++) {
$text = str_replace(chr($i), NULL, $text);
}
}
return $text;
}
static function auto_bb($form, $field) {
global $bb_start;
$out = '';
if (!$bb_start) {
$out = '<script language="JavaScript" type="text/javascript">;
function tag(text1, text2) {
if ((document.selection)) {
document.' . $form . '.' . $field . '.focus();
document.' . $form . '.document.selection.createRange().text = text1+document.' . $form . '.document.selection.createRange().text+text2;
} else if(document.forms['' . $form . ''].elements['' . $field . ''].selectionStart!=undefined) {
var element = document.forms['' . $form . ''].elements['' . $field . ''];
var str = element.value;
var start = element.selectionStart;
var length = element.selectionEnd - element.selectionStart;
element.value = str.substr(0, start) + text1 + str.substr(start, length) + text2 + str.substr(start + length);
document.forms['' . $form . ''].elements['' . $field . ''].focus();
} else document.' . $form . '.' . $field . '.value += text1+text2;
document.forms['' . $form . ''].elements['' . $field . ''].focus();}</script>';
$bb_start = 1;
}
return $out . '<div style="margin:1px;padding:2px;">
<a href="javascript:tag('[b]', '[/b]')"><img src="/style/icons/bb/b.png" alt="b" title="Жирный"/></a>
<a href="javascript:tag('[i]', '[/i]')"><img src="/style/icons/bb/i.png" alt="i" title="Наклонный"/></a>
<a href="javascript:tag('[u]', '[/u]')"><img src="/style/icons/bb/u.png" alt="u" title="Подчёркнутый"/></a>
<a href="javascript:tag('[s]', '[/s]')"><img src="/style/icons/bb/s.png" alt="s" title="Перечёркнутый"/></a>
<a href="javascript:tag('[php]', '[/php]')"><img src="/style/icons/bb/php.png" alt="cod" title="Код"/></a>
<a href="javascript:tag('[url=]', '[/url]')"><img src="/style/icons/bb/l.png" alt="url" title="Ссылка" /></a>
<a href="javascript:tag('[red]', '[/red]')"><img src="/style/icons/bb/red.png" alt="red" title="Красный"/></a>
<a href="javascript:tag('[green]', '[/green]')"><img src="/style/icons/bb/green.png" alt="green" title="Зелёный"/></a>
<a href="javascript:tag('[blue]', '[/blue]')"><img src="/style/icons/bb/blue.png" alt="blue" title="Синий"/></a><br />
</div>';
}
#получение кол-ва символов строки
static function utf8_strlen($str) {
if (function_exists('mb_substr')) {
return mb_strlen($str);
}
if (function_exists('iconv')) {
return iconv_strlen($str);
} else {
#извращенный способ при отсутствии библиотек
static $rus;
if (!isset($rus)) {
$rus = array('й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', 'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'Э', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю');
}
return strlen(str_replace($rus, '0', $str));
}
}
#Получение подстроки
static function utf8_substr($str, $len, $dot = 1, $start = 0) {
if (self::utf8_strlen($str) > $len) {
if (function_exists('mb_substr')) {
$str = mb_substr($str, $start, $len);
}
if (function_exists('iconv')) {
$str = iconv_substr($str, $start, $len);
} else {
$out = substr($str, $start, $len);
} // могут появиться нечитаемые символы
if ($dot) {
$str.=' ...';
}
}
return $str;
}
#Транслитерация русского текста в английский
static function translit($string) {
$table = array(
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Ґ' => 'G',
'Д' => 'D',
'Е' => 'E',
'Є' => 'YE',
'Ё' => 'YO',
'Ж' => 'ZH',
'З' => 'Z',
'И' => 'I',
'І' => 'I',
'Ї' => 'YI',
'Й' => 'J',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ў' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ы' => 'Y',
'Ъ' => '',
'Э' => 'E',
'Ю' => 'YU',
'Я' => 'YA',
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'ґ' => 'g',
'д' => 'd',
'е' => 'e',
'є' => 'ye',
'ё' => 'yo',
'ж' => 'zh',
'з' => 'z',
'и' => 'i',
'і' => 'i',
'ї' => 'yi',
'й' => 'j',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ў' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ы' => 'y',
'ъ' => '',
'э' => 'e',
'ю' => 'yu',
'я' => 'ya',
);
return str_replace(array_keys($table), array_values($table), $string);
}
static function retranslit($in) {
$trans1 = array("'", '`', ',', ' ', "Ё", "Ж", "Ч", "Ш", "Щ", "Э", "Ю", "Я", "ё", "ж", "ч", "ш", "щ", "э", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ь", "Ы", "а", "б", "в", "г", "д", "е", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ь", "ы");
$trans2 = array('_', '_', '_', '_', "JO", "ZH", "CH", "SH", "SCH", "Je", "Jy", "Ja", "jo", "zh", "ch", "sh", "sch", "je", "jy", "ja", "A", "B", "V", "G", "D", "E", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "C", "", "Y", "a", "b", "v", "g", "d", "e", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "", "y");
return str_replace($trans1, $trans2, $in);
}
static function tr_loads($in) {
return preg_replace('#[^A-z0-9_-.()]+#ui', '_', $in);
}
}