|
|
|
| Есть регулярное выражение, которое фильтрует маты (мату нет Дмитрия Петрова), нужно пройтись им по 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-выражение рабтало только вне тегов? | |
|
|
|
|
|
|
|
для: Wyfinger
(11.08.2007 в 05:17)
| | Обычно сначала "проходятся" по тексту, а только потом добавляют HTML-теги.
P.S. Теги содержат мат? | |
|
|
|
|
|
|
|
для: 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-теги.. | |
|
|
|
|
|
|
|
для: Wyfinger
(11.08.2007 в 05:51)
| | Лично мне вообще все антиматы не нравятся. Я бы посоветовал его выкинуть - ошибочные срабатывания, дополнительная нагрузка.
Что касается префикса: слабоват. Выходит, это 16 в 4-ой степени вариантов. Всего 65536 возможных префиксов. | |
|
|
|
|
|
|
|
для: Unkind
(11.08.2007 в 06:04)
| | Товарищ, я спрашиваю именно про регулярное выражение.
Временно я его отключил, но только временно, поскольку я всегда следить за форумом не могу, а матов в форуме терпеть не буду. Может быть прийдется состовлять список плохих слов (встроено в phpBB2).
На счет префиксов я вообще не понял, при чем тут варианты, мы же не криптостойкость обсуждаем, естественно если файл с получившимся именем (префикс и реальное имя файла) уже существует, будет сгенерированно новое имя файла.
Нужно помощь знатоков RegExpr. | |
|
|
|
|
|
|
|
для: 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($part, 0, $pos)); //Это не тег
$parts[] = $nt;
$parts[] = substr($part, $pos, strpos($part, ">") - $pos + 1);
}
else
{
if($part != "")
{
$part = strtoupper($part); //$part не тег
$parts[] = $part;
}
break;
}
}
$string = implode($parts);
echo(htmlspecialchars($string));
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(11.08.2007 в 09:02)
| | Спасибо. | |
|
|
|
|
|
|
|
для: Wyfinger
(11.08.2007 в 05:17)
| | Еть другой вариант - перенести это на клиент. JavaScript'ом обойти всё дерево, а текстовые node преобразовать в соответсвии с регэксом. | |
|
|
|
|