Автоцензор, исправление автоцензора

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

Покурил маны:
LOCALE SUPPORT

PCRE handles caseless matching, and determines whether characters are
letters, digits, or whatever, by reference to a set of tables, indexed
by character value. When running in UTF-8 mode, this applies only to
characters with codes less than 128. Higher-valued codes never match
escapes such as \w or \d, but can be tested with \p if PCRE is built
with Unicode character property support. The use of locales with Uni-
code is discouraged. If you are handling characters with codes greater
than 128, you should either use UTF-8 and Unicode, or use locales, but
not try to mix the two.
Источник: http://www.pcre.org/pcre.txt
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17273
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 633 раза
Поблагодарили: 2413 раз

Сообщение rxu »

Вот этот вариант лучше, мне кажется (с \p), только не должно ли там быть фигурных скобок вокруг L? Хотя, если работает, то и хорошо :)
Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

Возможно у меня не работало потому-что использовался модификатор u.

Добавлено спустя 1 минуту 29 секунд:

По этому поводу пишут:
If only one letter is specified with \p or \P, it includes all the properties that start with that letter. In this case, in the absence of negation, the curly brackets in the escape sequence are optional; these two examples have the same effect:


\p{L}
\pL
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17273
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 633 раза
Поблагодарили: 2413 раз

Сообщение rxu »

nissin писал(а):Возможно у меня не работало потому-что использовался модификатор u.
Вроде бы он у вас и остался?
nissin писал(а):            $censors['match'][] = '#(?<!\pL)(' . str_replace('\*', '\pL*?', preg_quote($row['word'], '#')) . ')(?!\pL)#iu';
Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

В режиме UTF-8(модификатор u) PCRE не смотрит на локаль при определении \w, поэтому нужно использовать \p последовательности.

Поэтому у Вас наверно и заработало при смене локали. Я же добавлял модификатор u, и менял локаль.

Вообщем нужно использовать только один из вариантов.
Подводные камни:
1) не всех хостеров есть UTF-8 локаль.
2) поддержка \p появилась в PHP только с 4.4.0 и 5.1.0

поэтому на крайний случай есть вариант с \S :)
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17273
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 633 раза
Поблагодарили: 2413 раз

Сообщение rxu »

nissin писал(а):2) поддержка \p появилась в PHP только с 4.4.0
Минимальным требованием для phpBB3 является PHP начиная с 4.3.3, однако конструкции \p используются в других местах кода, например, в регулярках при фильтрации регистрируемых имен пользователей.
Изображение
Lokust
phpBB 1.4.4
Сообщения: 119
Стаж: 20 лет 4 месяца

Сообщение Lokust »

Ребят, вы это о чем сейчас говорили? :(
Первый вариант неправильный что-ли? Рабочий, но неправильно рабочий?
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

rxu писал(а):Минимальным требованием для phpBB3 является PHP начиная с 4.3.3, однако конструкции \p используются в других местах кода, например, в регулярках при фильтрации регистрируемых имен пользователей.
Так в мануале (кажется от Zend-а) было написано, я не сам придумал :)
Может разработчики phpBB3 забыли про это дело.

2 Lokust
Все варианты рабочие (2 моих и 1 rxu), просто с ограничениями.
Мы просто уже в дебри полезли.
Lokust
phpBB 1.4.4
Сообщения: 119
Стаж: 20 лет 4 месяца

Сообщение Lokust »

nissin, плиз напишите потом какой лучше :oops:
Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Стаж: 20 лет 4 месяца
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 454 раза

Сообщение Палыч »

nissin
rxu
вы как-то договитесь и выложите рабочие варианты с кратким описанием ограничений, а то тема на третью страницу скоро полезет.

мусор почистим.
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.
gstas

Сообщение gstas »

Ребята... Конктерно скажите как сделать чтоб автоцензор нормально работал ???
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17273
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 633 раза
Поблагодарили: 2413 раз

Сообщение rxu »

Изображение
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

Действительно, давно пора сделать резюме, по порядку:

1) Рецепт от rxu. Если у хостера имеется локаль ru_RU.UTF-8 (обычно лежит в /usr/share/locale/)
открыть файл includes/utf/utf_tools.php
Найти:

Код: Выделить всё

setlocale(LC_CTYPE, 'C');
Заменить на:

Код: Выделить всё

setlocale(LC_CTYPE, 'ru_RU.UTF-8');

2) если установлен PHP начиная с 4.4.0 и 5.1.0
открыть файл includes/cache.php
Найти:

Код: Выделить всё

            $censors['match'][] = '#(?<!\w)(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')(?!\w)#i';
Заменить на:

Код: Выделить всё

            $censors['match'][] = '#(?<!\pL)(' . str_replace('\*', '\pL*?', preg_quote($row['word'], '#')) . ')(?!\pL)#iu'; 
почистить кэш (либо просто удалить cache/data_word_censors.php).


3) если стоит старый PHP
открыть файл includes/cache.php
Найти:

Код: Выделить всё

            $censors['match'][] = '#(?<!\w)(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')(?!\w)#i';
Заменить на:

Код: Выделить всё

            $censors['match'][] = '#(?<!\S)(' . str_replace('\*', '\S*?', preg_quote($row['word'], '#')) . ')(?!\S)#iu';
почистить кэш (либо просто удалить cache/data_word_censors.php).
Аватара пользователя
eric
phpBB 1.4.4
Сообщения: 156
Стаж: 19 лет 7 месяцев
Откуда: Москва

Сообщение eric »

Ребят, а как сделать, чтобы он был регистронезависимым? Мне приходится одно и тоже слово писать в трех вариантах (Слон, слон, СЛОН), он воспринимает их как разные слова. Цензура пройдет! А вбивать одно слово по 10 раз в лом!
Аватара пользователя
nissin
phpBB 3.0.4
Сообщения: 2229
Стаж: 18 лет 9 месяцев
Откуда: Астана
Благодарил (а): 7 раз
Поблагодарили: 344 раза

Сообщение nissin »

по идее любой вариант из тех что выше должен помочь.

Вернуться в «Поддержка phpBB 3.0.х»