Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Фильтр мата вне тегов
 
 автор: Wyfinger   (11.08.2007 в 05:17)   письмо автору
 
 

Есть регулярное выражение, которое фильтрует маты (мату нет Дмитрия Петрова), нужно пройтись им по html, но только по тексту.

//
// Replace badwords 
//
$mt_patt = "/\w{0,5}[хx]([хx\s\!@#\$%\^&*+-\|\/]{0,6})[уy]([уy\s\!@#\$%\^&*+-\|\/]{0,6})[ёiлeеюийя]\w{0,7}|\w{0,6}[пp]([пp\s\!@#\$%\^&*+-\|\/]{0,6})[iие]([iие\s\!@#\$%\^&*+-\|\/]{0,6})[3зс]([3зс\s\!@#\$%\^&*+-\|\/]{0,6})[дd]\w{0,10}|[сcs][уy]([уy\!@#\$%\^&*+-\|\/]{0,6})[4чkк]\w{1,3}|\w{0,4}[bб]([bб\s\!@#\$%\^&*+-\|\/]{0,6})[lл]([lл\s\!@#\$%\^&*+-\|\/]{0,6})[yя]\w{0,10}|\w{0,8}[её][bб][лске@eыиаa][наи@йвл]\w{0,8}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[uу]([uу\s\!@#\$%\^&*+-\|\/]{0,6})[н4ч]\w{0,4}|\w{0,4}[еeё]([еeё\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[нn]([нn\s\!@#\$%\^&*+-\|\/]{0,6})[уy]\w{0,4}|\w{0,4}[еe]([еe\s\!@#\$%\^&*+-\|\/]{0,6})[бb]([бb\s\!@#\$%\^&*+-\|\/]{0,6})[оoаa@]([оoаa@\s\!@#\$%\^&*+-\|\/]{0,6})[тnнt]\w{0,4}|\w{0,10}[ё]([ё\!@#\$%\^&*+-\|\/]{0,6})[б]\w{0,6}|\w{0,4}[pп]([pп\s\!@#\$%\^&*+-\|\/]{0,6})[иeеi]([иeеi\s\!@#\$%\^&*+-\|\/]{0,6})[дd]([дd\s\!@#\$%\^&*+-\|\/]{0,6})[oоаa@еeиi]([oоаa@еeиi\s\!@#\$%\^&*+-\|\/]{0,6})[рr]\w{0,12}/i";
$mt_repl = "<font color=red>[мат]</font>";
$message = preg_replace($mt_patt, $mt_repl, $message);


Как сделать, чтобы reg-выражение рабтало только вне тегов?

   
 
 автор: Unkind   (11.08.2007 в 05:34)   письмо автору
 
   для: Wyfinger   (11.08.2007 в 05:17)
 

Обычно сначала "проходятся" по тексту, а только потом добавляют HTML-теги.

P.S. Теги содержат мат?

   
 
 автор: Wyfinger   (11.08.2007 в 05:51)   письмо автору
 
   для: Unkind   (11.08.2007 в 05:34)
 

Я вставил антимат систему в форум (phpBB), при выводе темы, списка тем и в режиме предпросмотра при редактировании топика. Теги не содержат матов, но антимат система неверно реагирует на многие английские словосочетания. Так например тестовое сообщение phpBB:

This is an example post in your phpBB 2 installation. You may delete this post, this topic and even this forum if you like since everything seems to be working!

seems to be working распознается как мат.

Также я добавил к форуму свою систему закачки картинок, имя файлу дается как префикс из 4 символов md5 хеша текущей даты, короче случайные 4 байта, так они, вместе с путем к рисункам на сервере, частенько распознаются как мат.

Как Вы понимаете я не могу Обычно сначала "проходятся" по тексту, а только потом добавляют HTML-теги..

   
 
 автор: Unkind   (11.08.2007 в 06:04)   письмо автору
 
   для: Wyfinger   (11.08.2007 в 05:51)
 

Лично мне вообще все антиматы не нравятся. Я бы посоветовал его выкинуть - ошибочные срабатывания, дополнительная нагрузка.

Что касается префикса: слабоват. Выходит, это 16 в 4-ой степени вариантов. Всего 65536 возможных префиксов.

   
 
 автор: Wyfinger   (11.08.2007 в 07:52)   письмо автору
 
   для: Unkind   (11.08.2007 в 06:04)
 

Товарищ, я спрашиваю именно про регулярное выражение.

Временно я его отключил, но только временно, поскольку я всегда следить за форумом не могу, а матов в форуме терпеть не буду. Может быть прийдется состовлять список плохих слов (встроено в phpBB2).

На счет префиксов я вообще не понял, при чем тут варианты, мы же не криптостойкость обсуждаем, естественно если файл с получившимся именем (префикс и реальное имя файла) уже существует, будет сгенерированно новое имя файла.

Нужно помощь знатоков RegExpr.

   
 
 автор: Unkind   (11.08.2007 в 09:02)   письмо автору
 
   для: Wyfinger   (11.08.2007 в 07:52)
 

Нужно помощь знатоков RegExpr.
Не думаю, что они помогут. По моему личному мнению, в данном случае не выйдет это провернуть чисто с помощью RegEx.

Но можно так (в данном случае всё, кроме тегов, будет переведено в верхний регистр):
<?php
$string 
"String with <tag>";

for(
$p 0$parts = array() ;; $p strlen(implode($parts)))
{
    
$part substr($string$p);
    
$pos strpos($part"<");

    if(
$pos !== false)
    {
        
$nt strtoupper(substr($part0$pos)); //Это не тег
        
$parts[] = $nt;
        
$parts[] = substr($part$posstrpos($part">") - $pos 1);
    }
    else
    {
        if(
$part != "")
        {
            
$part strtoupper($part); //$part не тег
            
$parts[] = $part;
        }

        break;
    }
}

$string implode($parts);

echo(
htmlspecialchars($string));
?>

   
 
 автор: Wyfinger   (11.08.2007 в 11:00)   письмо автору
 
   для: Unkind   (11.08.2007 в 09:02)
 

Спасибо.

   
 
 автор: daer   (12.08.2007 в 03:21)   письмо автору
 
   для: Wyfinger   (11.08.2007 в 05:17)
 

Еть другой вариант - перенести это на клиент. JavaScript'ом обойти всё дерево, а текстовые node преобразовать в соответсвии с регэксом.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования