|
 |
Путь: Шпаргалки
Шпаргалки
Автор: - Vedeney
Дата публикации - 10.05.2005
Просмотров: - 6042
Фільтрація нецензурних висловлювань
Спробую в декількох словах подати свою пропозицію фільтрування нецензурних висловлювань.
[p]Опис проблеми:[/p]
Не викликає жодних проблем замінити нецензурні висловлювання „абракадаброю” чи зірочками. Однак людям, емоції яких пруть через верх, зустрівшись з системою фільтрування матів намагаються всіляко обманути її. Ось класичні прийоми:
заміна регістру букв (приклад: „бля” – „БлЯ”);
розділення букв пробілами чи іншими розділовими знаками (приклад: „бля” – „б ля”, „б.ля”);
заміна букв кириличного алфавіту подібними латинськими символами;
заміна букв комбінацією інших символів, які ззовні нагадують відповідний символ (приклад: „хер” – „}{ер”, „курва” – „|<урва”).
Коли ж недобросовісний відвідувач використовує комбінацію з цих прийомів, будь-яка система стає неспроможною відслідкувати подібний обман.
Запропонована система в принципі вирішує всі ці задачі. Для фільтрування використовується регулярні вирази. Ось функція яка генерує патерни для фільтрування.
[php]
<?php
// $mat(string) - аргумент який є тим самим матом для якого генерується паттерн
function get_pattern($mat)
{
// переводимо літери в нижній регістр
$mat=strtolower($mat);
// визначаємо довжину слова
$len=strlen($mat);
// початок патерну
$pattern="/";
// перебираємо слово по буквам
for ($i=0; $i<$len; $i++) {
$symbol=substr($mat,$i,1);
switch ($symbol) {
// заміняємо літери на їх можливі підміни чи транслітерацію
case "а":
$symbol="а|a";
break;
case "б":
$symbol="б|b";
break;
case "в":
$symbol="в|b|v";
break;
case "г":
$symbol="г|g|h";
break;
case "д":
$symbol="д|d";
break;
case "е":
$symbol="е|e";
break;
case "є":
$symbol="є|e|je";
break;
case "ж":
// можливі підміни літери "ж" - "]|[""}|{"
$symbol="ж|zh|\*|\]\|\[|\}\|\{";
break;
case "з":
$symbol="з|z|3";
break;
case "и":
$symbol="и|n|y";
break;
case "і":
$symbol="і|i|\||1";
break;
case "ї":
$symbol="ї|ji|i|\|";
break;
case "й":
$symbol="й|j";
break;
case "к":
$symbol="к|k|\|<";
break;
case "л":
$symbol="л|l|/\\";
break;
case "м":
$symbol="м|m";
break;
case "н":
$symbol="н|n|h";
break;
case "о":
$symbol="о|o|0";
break;
case "п":
$symbol="п|p";
break;
case "р":
$symbol="р|r|p";
break;
case "с":
$symbol="с|c|s";
break;
case "т":
$symbol="т|t";
break;
case "у":
$symbol="у|y";
break;
case "ф":
$symbol="ф|f";
break;
case "х":
// можливі підміни літери, окрім латинського відповідника, "х" - "][""}{"
$symbol="х|x|h|\]\[|\}\{";
break;
case "ц":
$symbol="ц|c|ts";
break;
case "ч":
$symbol="ч|ch|4";
break;
case "ш":
$symbol="ш|w|sh";
break;
case "щ":
$symbol="щ|w|sch";
break;
case "ю":
$symbol="ю|u|ju";
break;
case "я":
$symbol="я|r|ya|ja";
break;
case "ь":
$symbol="ь|b|`";
break;
// а це для наших російських друзів, все ж таки мат в них вишуканіший ;)
case "ы":
$symbol="ы|ь\||b\|";
break;
}
// оформляємо його як субпатерн і ставимо в кінці квантифікатор "+" (один і більше)
// для того, щоб уникнути повтору літер (наприклад "куррва")
$pattern.="(".$symbol.")+";
//якщо лідера не є останньою в слові
if ($i!=$len-1){
//вказуємо діапазон символів, які можуть бути між літерами
// "\W" - любий "несловарний" символ
// "\s" - любий пробільний символ
// в кінці квантифікатор * (0 і більше)
// дозволяє уникнути ситуації коли літери розділяють пробілами
//чи любими несловарними символами, будь-якої довжини (приклад "б л я", "б_д я")
$pattern.="[\W,\s]*";
}
}
// завершуємо формування патерну і ставимо в кінці модифікатор "i" - букви в патерні
// співпадають незалежно від регістру (приклад "бля", "бЛя")
$pattern.="/i";
//повертаємо патерн
return $pattern;
}
?>
[
/php]
Отримуємо приблизно такий патерн „/(х|x|\]\[\|\}\{)+[\W,\s]*(у|y)+[\W,\s]*(й)+/i „. Що з ним робити питання фантазії.
Єдина незручність, що подібний патерн НАДТО гарно фільтруватиме слова: виріже частину в слові «рахуй», прізвище відомого автогонщика Шумахера також постраждає.
Обсудить в ФОРУМе - комментариев ()
Путь: Шпаргалки
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|