::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - header
  - Я канєшно вибачаюся, ну от вирішив навчи...
  - Трудности с включенным safe mode, не вид...
  - Поможіть з установкою локальки
  - Помогите с функцией utf2win1251
  - Вывод окна предупреждения
  - допоможіть нічого не розумію


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Шпаргалки

Шпаргалки

Автор: - Vedeney
Дата публикации - 10.05.2005
Просмотров: - 6348

Фільтрація нецензурних висловлювань


Спробую в декількох словах подати свою пропозицію фільтрування нецензурних висловлювань.

[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.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005