Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2010-10-20 17:04:59

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Цензура как защита от безграмотности

На многих форумах мат запрещён правилами, и надобности в фильтре как таковой нет. В конференции iXBT придумали использовать цензуру как защиту от безграмотности и жаргона. Скажем, пробывал превращается в про..ал, а в форуме "Модули памяти" нельзя писать производителей транслитом: кингстон становится чем-то вроде ки..он. Вопросы "А почему про..ал не выводится, я же не матерился?" сильно доставляют. smile

Надеюсь, идея понятна. Для реализации нужна замена с сохранением регистра. Как понимаю, изначально цензура рассчитана на замену мата звёздочками или другими нерегистровыми символами.

Offline

#2 2010-10-20 17:41:52

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Цензура как защита от безграмотности

Freeman, нет.
Что напишешь в замене к конкретному слову, то и будет выводиться вместо него.
Т.е. нужно самому составлять словарь замены слов.

Offline

#3 2010-10-20 17:59:38

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: Цензура как защита от безграмотности

Visman, а регистр? Пробовал проделать в PunBB 1.2, не получилось.

Offline

#4 2010-10-20 18:30:36

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Цензура как защита от безграмотности

Freeman, найди в functions.php

            $search_for[$i] = '/(?<=\W)('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')(?=\W)/i';

и попробуй заменить на

            $search_for[$i] = '/(?<=\W)('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')(?=\W)/';

возможно так будет учитываться регистр при проверке цензуры, но на 100% не уверен.

Offline

#5 2010-10-21 07:15:29

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Цензура как защита от безграмотности

В нынешней реализации регулярок на PHP реально существует проблема регистронезависимости для unicode символов. Точнее проблема в нынешней версии PCRE, которую использует PHP. К тому же неправильно интерпретируются такие спецсимволы как \w и \b. Красивого решения нет, надо ждать новых версий.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#6 2010-10-21 07:47:43

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Цензура как защита от безграмотности

Более-менее приемлемый результат будет, если убрать символы "\b" из выражения и добавить модификатор уникод "u".

            $search_for[$i] = '/('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')/iu';

но тут возникает проблема — ищется не полное слово, а любая подстрока.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#7 2010-10-21 07:57:21

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Цензура как защита от безграмотности

По мотивам этого сделал вродебы рабочий тест. Можете погонять на своих примерах и делать выводы:

<?php

$text = 'Рас два три Твою мать';

$censor = array(
'рас'  => 'раз',
'твою' => 'вашу',
'мать' => 'маму',
);


$search_for =  $replace_with = array();
foreach ($censor as $k => $v)
{
    $search_for[] = '/[^\p{L}]('.str_replace('\*', '[\p{L}]*?', preg_quote($k, '/')).')[^\p{L}]/iu';
    $replace_with[] = ' '.$v.' ';
}

$new_text = substr(preg_replace($search_for, $replace_with, ' '.$text.' '  ), 1, -1);
echo $text . '<br/>' . $new_text;

для меня загадка почему в заменяемый текст попадают символы ВНЕ КРУГЛЫХ СКОБОК. обхожу проблему с помощью подклеивания пробелов  ' '.$v.' ';


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#8 2010-10-21 08:35:41

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Цензура как защита от безграмотности

Visman, я обнаружил твою правку, которая помоему нерабочая. Или рабочая в частном случае по недоразумению:
ты предложил здесь (с модификатором u)
http://fluxbb.org/forums/viewtopic.php?pid=33306#p33306
закомичено здесь (без модификатора)
http://github.com/fluxbb/fluxbb/commit/ … 8cb914c2ee

\w и \W не корректно работают в Unicode версии PCRE.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#9 2010-10-21 10:16:24

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Цензура как защита от безграмотности

artoodetoo, я им ее предложил на основе PunBB 1.3.
Маленько тестил тот вариант, проблем не было.

То что ты сегодня на оф.форуме предложил, тестил?

З.Ы. И Freeman не по этому поводу написал запрос wink
Он хочет, чтобы при замене цензуры оставался тот регистр, который в начальном слове был для буков.

Offline

#10 2010-10-22 06:28:08

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Цензура как защита от безграмотности

Visman пишет:

То что ты сегодня на оф.форуме предложил, тестил?

З.Ы. И Freeman не по этому поводу написал запрос wink
Он хочет, чтобы при замене цензуры оставался тот регистр, который в начальном слове был для буков.

Тестил маленько. Выводы делаю в основном теоретически: если \w \b \W НЕ понимают уникод, значит оно не может работать так, как мы ожидаем.

Сохранить регистр просто поправив регулярку не получится. Надо воротить что-то более навороченное, думаю нафиг это не нужно.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens