Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
На многих форумах мат запрещён правилами, и надобности в фильтре как таковой нет. В конференции iXBT придумали использовать цензуру как защиту от безграмотности и жаргона. Скажем, пробывал превращается в про..ал, а в форуме "Модули памяти" нельзя писать производителей транслитом: кингстон становится чем-то вроде ки..он. Вопросы "А почему про..ал не выводится, я же не матерился?" сильно доставляют.
Надеюсь, идея понятна. Для реализации нужна замена с сохранением регистра. Как понимаю, изначально цензура рассчитана на замену мата звёздочками или другими нерегистровыми символами.
Offline
Freeman, нет.
Что напишешь в замене к конкретному слову, то и будет выводиться вместо него.
Т.е. нужно самому составлять словарь замены слов.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
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% не уверен.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
В нынешней реализации регулярок на PHP реально существует проблема регистронезависимости для unicode символов. Точнее проблема в нынешней версии PCRE, которую использует PHP. К тому же неправильно интерпретируются такие спецсимволы как \w и \b. Красивого решения нет, надо ждать новых версий.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Более-менее приемлемый результат будет, если убрать символы "\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
По мотивам этого сделал вродебы рабочий тест. Можете погонять на своих примерах и делать выводы:
<?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
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
artoodetoo, я им ее предложил на основе PunBB 1.3.
Маленько тестил тот вариант, проблем не было.
То что ты сегодня на оф.форуме предложил, тестил?
З.Ы. И Freeman не по этому поводу написал запрос
Он хочет, чтобы при замене цензуры оставался тот регистр, который в начальном слове был для буков.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
То что ты сегодня на оф.форуме предложил, тестил?
З.Ы. И Freeman не по этому поводу написал запрос
Он хочет, чтобы при замене цензуры оставался тот регистр, который в начальном слове был для буков.
Тестил маленько. Выводы делаю в основном теоретически: если \w \b \W НЕ понимают уникод, значит оно не может работать так, как мы ожидаем.
Сохранить регистр просто поправив регулярку не получится. Надо воротить что-то более навороченное, думаю нафиг это не нужно.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Страницы 1