• Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: JonMagon  
Сообщество uCoz » Вебмастеру » JavaScript, Flash и прочие технологии » Антимат для любого модуля (функция замены плохих слов для любых модулей, пример - форум)
Антимат для любого модуля
Aleko
Репутация: 46

Сообщение # 1 | 00:04:02
Такая тема много где рассматривалась. Поискал готовые решения - не нашел. Решил создать тему здесь и предложить свое решение. Я придумал способ заменять плохие слова (мат) в любом модуле и на любой странице сайта. Читаем полный урок по установке скрипта на моем форуме вот тут. Надеюсь вам понадобится.

Вот собственно сам урок:

На форуме техподдержки многие просили рассказать, как можно сделать функцию антимата (замены "нехороших" слов на форуме). Я придумал способ, который позволяет заменять плохие слова на что угодно в любом нужном вам модуле: в комменатриях, на форуме, в гостевой и так далее..

Для того, чтобы плохие слова на странице были заменены, вам необходимо в самый конец html кода нужной страницы, но перед тегом вставить скрипт:

Code
<script>

// Антимат от http://StudioAD.ru by Aleko

txt = document.body.innerHTML;

// Ниже вместо слова "мат" впишите слова или словосочетания которые хотите заменить
// каждое новое слово должно отделяться от предыдущего символом |         
// перед и после слова пробелов быть не должно
// все написанные вами слова буду заменены на [cencored]

bad = /мат|мат|мат/i;

// Конец редактируемой зоны

while (txt.indexOf(bad)>=0) txt = txt.replace(bad, '<span style="color: #FF0000">[cencored]</span>');
document.body.innerHTML = txt;
</script>


И настроить его следуя инструкциям которые прописаны прямо в коде.
При копировании данного сообщения на другие ресурсы ссылка на StudioAD.ru обязательна!

Сообщение отредактировал Aleko - Четверг, 18 Сен 2008, 12:51:34
rsod
Сообщений: 324
Репутация: 231

Сообщение # 2 | 12:52:09
Заключаем $BODY$ в <div id="antimatBody"><div>
Code
<div id="antimatBody">$BODY$<div>

и вместо document.body.innerHTML везде подставляем document.getElementById("antimatBody").innerHTML. И никаких проблем.
И стоило ли флудить? wacko

Zip file! Zip file!
Altum
Сообщений: 1
Репутация: 4

Сообщение # 3 | 22:31:55
Писал антимат для своего форума, правда словарь писал не как 1 регулярку, а массивом... Мб пригодится
Code

wrd="-_-";
repLst = new Array (
Array (/(^|[^А-я]|a|а|е|e|ни|о|o|в|с|c|ри|й|ь|т)(?:х|x)(?:у|y)(ле|лe|ли|й|я|ю|е|e|и|ё)/gi,"$1"+wrd),
Array (/(^|[^А-я])(?:с|c)(?:ц|)(?:у|y)(?:ч|)(?:к|k|)(а|a|е|e|у|y|и|о|o|$|[^А-я])/gi,"$1"+wrd+"$2"),
Array (/(^|[^А-я])гнид(а|a|o|о)/gi,wrd),
Array (/(^|[^А-я])(м|m)(а|a|o|о)нд(а|a|$|[^А-я])/gi,wrd),
Array (/пид(?:о|o|а|a)р/gi,wrd),
Array (/чмыр/gi,wrd),
Array (/г(?:о|o|а|a)(?:н|h|n)д(?:о|o)(?:н|h|n|c|с|$|[^А-я])/gi,wrd),
Array (/(?:от|oт|ат|aт|пo|по|^|[^А-я])(?:с|c)(?:о|o|a|а)(?:c|с)(?!ед)(?:и|e|е|a|а|y|у|$|[^А-я])/gi,wrd),
Array (/з(?:о|а|o|a)л(?:у|y)п/gi,wrd),
Array (/(^|[^А-я])ж(?:о|o)п(a|a|е|e|у|y|о|o|$|[^А-я])/gi,"$1"+wrd+"$2"),
Array (/м(?:у|y)д(о|o|a|ак|ач|ил|ищ)/gi,wrd+"$1"),
Array (/(^|[^А-я]|в|ф|от|ы|о|а|с|у|ре|ри)п(?:и|е|e|ё)(?:с|c|з)(?:д|ж)(а|a|о|o|у|y|е|e|ю|и|ы|я|ё|$|[^А-я])/gi,"$1"+wrd+"$2"),
Array (/(^|[^А-я]|о|o|фу|ы|e|е|и)(?:б|6)ля(т|ц|д|я|[^А-я])/gi,"$1"+wrd+"$2"),
Array (/(^|[^А-я]|на)(?:х|x)(?:e|е)(?:р|p)([^А-я]|h|н|o|о|\s|$)/gi,"$1"+wrd+"$2"),
Array (/(^|[^А-я]|вы|не|ни|о|o|от|oт|ь|ъ|на|за|ре|ри|у|раз|долба)(?:e|е|ё|и)(?:б|6|п)(?!оль)(с|o|о|е|e|щ|к|и|н|у|y|л|ы|ё|а|a|[^А-я]|$)/gi,"$1"+wrd+"$2")
);

///////////////////////////////////////////////////////////
function gEBC(cl){var rn=[]; var myclass=new RegExp('\\b'+cl+'\\b');var elem=document.getElementsByTagName("*");    
for (var i=0;i<elem.length;i++){var classes=elem[i].className;if(myclass.test(classes))rn.push(elem[i]);}return rn;
}    

function checkElement(ID)
{allNodes=gEBC(ID);    
    for(i=0;i<allNodes.length;i++)    
    {thtml=allNodes[i].innerHTML;
      for(j=0;j<repLst.length;j++) thtml=thtml.replace(repLst[j][0], repLst[j][1]);
      allNodes[i].innerHTML=thtml;
    }    
}
checkElement("posttdMessage");
Сообщение отредактировал Altum - Четверг, 28 Май 2009, 21:34:58
YuriT
Сообщений: 231
Репутация: 701
Уровень замечаний:

Сообщение # 4 | 11:59:09
Форваржу из лички верное замечание по теме от blackhawk_dark. Этот подход работает чуть менее надежно, но зато меньше напрягает читателей и вполне подходит в 99.9% всех случаев:
Quote (blackhawk_dark)
нашел в форуме тему «Антимат для любого модуля», а статуса не хватает, чтобы пост оставить. Совсем недавно по вашему форуму лазить стал.

Честно говоря, прочитав все посты, не совсем понимаю, зачем нужно «изобретать велосипед»? Зачем проверять все страницы, когда можно проверять только форму полей поста при попытке отправить сообщение. И при вхождении >0 просто не давать отправлять сообщение. Это абсолютно не будет нагружать как отдельный сайт, так и систему в общем. Ну разумеется, если в пост не запихнуть 4-ре тома «Война и мир». Опять же при должном желании скрипт можно сделать достаточно гибким как к вводимому регистру, так и к служебным символам.

Пояснение: специально для проверки всех отсылаемых данных на форуме и во всех модулях существует функция chechsubmit() , которую и надо определить. Т.е. в шаблон "форма добавления сообщения" форума в конец вставляем скрипт типа такого:

Code
<script type="text/javascript">
function checksubmit(){
   var msg;
   msg=document.getElementById('frM27');
   if(msg) msg.value=RemoveMat(msg.value);
   msg=document.getElementById('frM30');
   if(msg) msg.value=RemoveMat(msg.value);
   msg=document.getElementById('message');
   if(msg) msg.value=RemoveMat(msg.value);
   return true;
}
</script>

Здесь элементы с id=''frM27', 'frM30', 'message' - это поля ввода названия и описания темы и самого текста сообщения.
Функцию удаления мата RemoveMat() нужно написать самим.
Либо показываем предупреждение и делаем return false, тогда пост просто не отсылается.

Аналогично можно сделать для страницы добавления/редактирования материала или формы добавления комментария, только там нужно смотреть, в каких именно полях делать проверку и замену.


Потеряшка - поиск потерянных и помощь бездомным животным в Питере
Сообщение отредактировал YuriT - Вторник, 11 Авг 2009, 12:03:54
Infegral
Сообщений: 5
Репутация: 0

Сообщение # 5 | 12:11:18
Мне кажется, весь код тут написан в стиле "Что-то знаю, это и напишу". Особенно - первый пост, где автор просто не представляет последствий изменения innerHTML тега <body>. Я недавно писал на js/jquery код для замены [img] (!в том числе в чате!), так что моё небольшое творение можно растаскивать с условием сохранения копирайта (УК РФ еще никто не отменял). Вставлять в любой глобальный блок.

P.S. Всё, что выше, крайне не рекомендуется к применению (за исключением этого, но я слегка добавил возможностей)

shtof
Сообщений: 8
Репутация: 1

Сообщение # 6 | 22:40:40
Простите, случайно попал на эту тему. Наверно, наивный я (чем более пользуюсь юкоз'ом, тем более убеждаюсь в его "бесплатности"... не в укор, все понимаю), но как новичку хотелось бы услышать "официальную" точку зрения... я не конкретно об этой теме. ( А мож я не в теме?.. все подобные рецепты проходят премодерацию?)
fflesh
Сообщений: 1784
Репутация: 1314

Сообщение # 7 | 22:51:00
shtof,
Quote (shtof)
но как новичку хотелось бы услышать "официальную" точку зрения...

Что для вас “Официальная точка зрения”?
Одобрение официальным лицом того или иного скрипта?

Quote (shtof)
я не конкретно об этой теме

А о какой тогда?

Скажу по данной теме, личное мнение - все подобные клиентские скрипты - коим является JavaScript - ерунда.
Лучший антимат - адекватные Администратор/Модераторы форума. И правильная система штрафов и наказания.

Всё написанное выше - моё личное мнение и на абсолютную правоту не претендует.
Есть вопросы лично ко мне - пиши сюда: http://likbezz.ru/forum/8
Сообщение отредактировал fflesh - Четверг, 24 Май 2012, 04:36:19
shtof
Сообщений: 8
Репутация: 1

Сообщение # 8 | 01:59:24
fflesh,
В данном случае. для меня ваше (модератора данного форума) мнение - официальное.
Полагаю, что вы знаете к каким последствиям может привести то или иное использование исполняемых приложений (не входящих по умолчанию в юкоз)... ну я загнул... извини, не знаю как точнее выразиться
fflesh
Сообщений: 1784
Репутация: 1314

Сообщение # 9 | 04:49:58
shtof,
Quote (shtof)
Полагаю, что вы знаете к каким последствиям может привести то или иное использование исполняемых приложений (не входящих по умолчанию в юкоз)...

По умолчание много чего не входит в юкоз, и некоторые вещи очень полезны.
Но не, так называемые, скрипты антимата и подобные.
Во первых, всё это работает на стороне клиента, а значит может быть отключено или обойдено.
Второе, антимат, как модуль, по сути словарь, а словарь - это достаточно большой объем данных для сравнения, а значит серьёзная нагрузка на браузер клиента и высокое время исполнения скрипта. Словарь из 100 слов/регулярных выражений - это не словарь.
Если словарная база маленькая, неполная - толку от неё ноль. И будут ложные срабатывания - «сучья деревьев»
В третьих, в некоторых случаях мат/неформальные выражения может быть кстати. Отфильтровать такое, мнение, может только человек.

Всё написанное выше - моё личное мнение и на абсолютную правоту не претендует.
Есть вопросы лично ко мне - пиши сюда: http://likbezz.ru/forum/8
Сообщение отредактировал fflesh - Четверг, 24 Май 2012, 04:50:20
starlayt
Сообщений: 18
Репутация: 7

Сообщение # 10 | 02:14:46
Товарищи, ну что вы людям головы дурите. Самый первый скрипт у меня не пашет, страница становится девственно чиста. Да и вообще циклы в топку, ничего не смог с ними написать. Остальные вообще не понял как работают. И по всей видимости они заменяют текст уже на странице, а не в форме добавления. Зачем это? Надо лучше модерировать. А вот для присечения попыток написать мат на форуме и в комментах ловите мое простое решение:
Код
<script language="javascript">
var mat = /мат0|мат1|мат2/igm; //по аналогии делаем словарь
setInterval('antimat()', 100); //больший интервал советую не ставить, т.к. будет срабатывать с тормозами, а так быстро
function antimat() {
txt = document.getElementById("message").value;
txt = txt.replace(mat, '[мат]'); //в кавычках вставьте свою замену на вкус
document.getElementById("message").value=txt;
}
</script>

Нужно воткнуть в шаблоне добавления постов в самый конец или в самое начало. Работает как часы. По поводу лишней нагрузки не бойтесь - матерных слов и их вариантов (регистр не учитывается, не надо вводить одно и тоже слово с разным регистром) не так уж много, а срабатывание таймера и функции выдержит даже калькулятор, что говорить о мощных компах. Проводил эксперемент с более 3к символов в форме, срабатывало без глюков. А что про мобилки и планшеты - там набор текста сам по себе тормозит, тоже ничего страшного не случится.
P.S. Проверить можете легко - правьте словарь, копируйте, CTRL+U и вставляем в head или любое другое место, жмем применить изменения и любуемся. Я всегда так скрипты пишу, чтоб прям сразу проверять.
Сообщение отредактировал starlayt - Пятница, 11 Янв 2013, 02:21:14
Miss_Esq
Сообщений: 13859
Репутация: 4159
Уровень замечаний:

Сообщение # 11 | 02:21:28
starlayt, Во всех обозревателях работает ? А Doctype используется в общих настройках сайта ?

starlayt
Сообщений: 18
Репутация: 7

Сообщение # 12 | 02:31:43
Не проверял, если такой простой как 2х2 код где-то не работает, очень удивительно. Мобилы с планшетами опять не в счет, как показали опыты яваскрипт в них работает фиг знает как - вот такой простой к примеру не запустится, а супернавороченый например новогодние снежинки будет работать. Doctype у меня не используется, скрипт работает. И тут работает, только заметил важную особенность - надо включить режим bb кодов, т.е. если редактор заскриптован ( используется визуальное редактирование) то небудет работать. Т.е. форма добавления должна быть простая, а не со всеми плюшками. Хотя и для нее найдется решение, надо покапать шаблон и вставить в нужном месте кусок этого скрипта (без тегов script, var перенести в начало) в другой скрипт.
Сообщение отредактировал starlayt - Пятница, 11 Янв 2013, 02:32:38
Miss_Esq
Сообщений: 13859
Репутация: 4159
Уровень замечаний:

Сообщение # 13 | 02:41:09
starlayt,
Цитата
Doctype у меня не используется
Это не важно используете или нет и каким обозревателем пользуетесь, если предлагаете скрипт то он должен работать в любых обозревателях (IE, Opera, Chrome, Firefox), как с Doctype так и без него ..

Цитата
очень удивительно
И кстати бывает очень часто, так как "скрипачи" несомневаясь в своём опыте пишут и не проверяют простые скрипты ... В итоге НЕ РАБОТАЮТ в том или ином случае ..

starlayt
Сообщений: 18
Репутация: 7

Сообщение # 14 | 02:59:33
Подозреваю что document.getElementById и аналогичные могут не работать ниже 6 ишака, где-то на javascript форуме были об этом сообщения.
Miss_Esq
Сообщений: 13859
Репутация: 4159
Уровень замечаний:

Сообщение # 15 | 10:50:14
starlayt,
Цитата
могут не работать ниже 6 ишака
Шестая версия не берётся в расчёт кроссбраузерности .. Эта версия была выпущена в древности ещё до выпуска Windows XP ...

Сообщество uCoz » Вебмастеру » JavaScript, Flash и прочие технологии » Антимат для любого модуля (функция замены плохих слов для любых модулей, пример - форум)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: