|
|
|
| Подскажите как данный класс переделать под cp1251?
Что не пытаюсь делать, ничего не получается...
class SwearFilter
{
/**
* Hold transliteration table (english set)
*
* @var array
*/
static private $translitTableFrom = array(
'a', 'b', 'v', 'g', 'd', 'e', 'g', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p',
'r', 's', 't', 'u', 'f', 'i', 'e', 'A', 'B', 'V', 'G', 'D', 'E', 'G', 'Z', 'I',
'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'I', 'E', 'yo', 'h',
'ts', 'ch', 'sh', 'shch', 'yu', 'ya', 'YO', 'H', 'TS', 'CH', 'SH', 'SHCH', 'YU', 'YA'
);
/**
* Hold transliteration table (russian set)
*
* @var array
*/
static private $translitTableTo = array(
'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п',
'р', 'с', 'т', 'у', 'ф', 'ы', 'э', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И',
'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Ы', 'Э', 'ё', 'х',
'ц', 'ч', 'ш', 'щ', 'ю', 'я', 'Ё', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ю', 'Я'
);
/**
* Bad words array of string in preg_match regexp's compatibile format. You must manualy assign
* regexp's delimiters, modifier for matching string start/end. Also don`t forget to use PCRE8
* modifier (http://ru2.php.net/manual/en/reference.pcre.pattern.modifiers.php).
*
* @var array
*/
static private $badWords = array(
"/^.*ху(й|и|я|е|л(и|е|ё))*.*/u", "/^.*пи(з|с)(д|ж).*/u", "/^бля.*/u", "/^.*бля(д|т|ц).*/u",
"/^(с|сц)ук(а|о|и).*/u", "/^(:|_|-|вы|)еб(а|ок|ли|у|и|ен|еня).*/u", "/^об(ъ).*/u", "/^.*уеб.*/u", "/^заеб.*/u", "/^.*еб(а|и)(н|с|щ|ц).*/u",
"/^.*ебу(ч|щ).*/u", "/^.*п(и|ы)д(о|е)р.*/u", "/^.*хер.*/u", "/^г(а|о)ндон/u", "/^.*залуп.*/u", "/^.*(ё|е)б(н|к|с).*/u", "/^.*(ё|е)б(а|ы).*/u"
, "/^.*(ё)б.*/u", "/^(ипаться|ниипет|хрена|нехира|кондом|нах|пох|йух)/u", "/^.*п(е|и)д(и|е|р|ар|ок).*/u", "/^.*муд(ак|и|о).*/u",
"/^м(а|о)н(да)/u",
);
/**
* Use it to filtrate input string for swear words. During filtration all swear words replaced
* by '*' symbol.
*
* @param string $string Source string
* @return string Filtered string with swear replaced by '*' symbol.
*/
public function filter($string)
{
$swearingFound = false;
//here we explode string to words
$elems = explode (" ", $string);
$count_elems = count($elems);
for ($i = 0; $i < $count_elems; $i++) {
//Transliterate alnum filterter string. We can`t use strtr due to UTF8.
$str_rep = str_replace(self::$translitTableFrom,self::$translitTableTo,
preg_replace('/[^a-zA-Zа-яА-Яё]/u', '', mb_strtolower($elems[$i], 'UTF8'))
);
//Here we are trying to find bad word matching in the special array
$countBadWords = count(self::$badWords);
for ($k = 0; $k < $countBadWords; $k++) {
if (preg_match(self::$badWords[$k], $str_rep)) {
$elems[$i] = str_repeat('*', mb_strlen($elems[$i], 'UTF8') - 1);
$swearingFound = true;
break;
}
}
}
//here we implode words in the whole string
if ($swearingFound) {
$string = implode (" ", $elems);
}
return $string;
}
}
|
| |
|
|
|
|
|
|
|
для: maxfade
(01.09.2011 в 15:14)
| | Хм... может проще преобразовать в UTF-8 проверяемую строку (не на совсем, а лишь для проверки)? | |
|
|
|
|
|
|
|
для: cheops
(01.09.2011 в 15:50)
| | Вся проблема в том, что файл в котором все это находиться сохранен в кодировке ANSI и не подразумевает использование UTF-8.
Написал свой упрощенный варинат...
function anti_mate($string)
{
$bad_word = array("/ху(й|и|я|е|л(и|е|ё))/si","/пи(з|с)(д|ж)/si","/бля/si","/бля(д|т|ц)/si","/(с|сц)ук(а|о|и)/si","/(:|_|-|вы|)еб(а|ок|ли|у|и|ен|еня)/si","/об(ъ)/si","/уеб/si","/заеб/si","/еб(а|и)(н|с|щ|ц)/si","/ебу(ч|щ)/si","/п(и|ы)д(о|е)р/si","/хер/si","/г(а|о)ндон/si","/залуп/si","/(ё|е)б(н|к|с)/si","/(ё|е)б(а|ы)/si","/(ё)б/si","/(ипаться|ниипет|хрена|нехира|кондом|нах|пох|йух)/si","/п(е|и)д(и|е|р|ар|ок)/si","/муд(ак|и|о)/si","/м(а|о)н(да)/si");
setlocale(LC_ALL, "ru_RU.CP1251");
$arr = explode(" ",$string);
if(is_array($arr) AND isset($bad_word))
{
foreach ($arr AS $v)
{
$error = 0;
for($i=0;$i<count($bad_word);$i++)
{
if(preg_match($bad_word[$i],mb_strtolower($v))) $error++;
}
if($error>0) $val[] = preg_replace($bad_word,"***",mb_strtolower($v));
else $val[] = $v;
}
return implode(" ",$val);
}
}
|
Вроде все работает как надо, кому надо забирайте :) | |
|
|
|
|