ФорумПрограммированиеPHP для идиотов → Как применить фильтр по словам при посте.

Как применить фильтр по словам при посте.

  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 16:36

    Допустим у нас есть список запрещенных слов в базе.
    Мы хотим не разрешать посты (ну например в гостевуху) мессаг с любым из этих слов.
    Как бы вы сделали проверку?

    Извлечь все слова и прогнать через strstr? А если слов дофига?
    SQL? Тоже не совсем тривиально … строковые функции и прочее.

    Какой алгоритм оптимален?

  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 16:47, спустя 10 минут 51 секунду

    если ты про реальную защиту то я думаю тебе ничто не поможет - захотят насрут

    если про алгоритм то наверное средствами sql

    $sql = "SELECT COUNT(*) FROM restrictions WHERE word IN (".explode(" ",$message).")";
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 16:49, спустя 2 минуты 9 секунд

    AlexB,
    1. Использовать sphinx и написать свой морфологизатор, чтобы ловить нечто вида "CyK4"
    2. Погуглить сервисы общие, чтобы такие слова набирались не из одного источника, тогда можно будет словить "сука, хуй, пизда" и т.д.
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 16:56, спустя 6 минут 14 секунд

    CTAPbIu_MABP, я про алгоритм.
    Хотелось именно находить слова в строке. Т.е. "Бла бла __хуй__ бла бла" тоже не должно пропустить.

    ЗЫ. Знаю, что в таком варианте и "Застрахуй" не пропустит, но это устраивает.
    Спустя 85 сек.

    AlexB,
    1. Использовать sphinx и написать свой морфологизатор, чтобы ловить нечто вида "CyK4"
    2. Погуглить сервисы общие, чтобы такие слова набирались не из одного источника, тогда можно будет словить "сука, хуй, пизда" и т.д.
    Да не, мне важна именно алгоритмическая реализация. Сами слова не важны, это не для фильтра от мата. Там именно поиск сигнатур.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 16:57, спустя 1 минуту 1 секунду

    я бы даже такое чтото заюзал, в принципе при индексах этот вариант будет обладать очень неплохой скоростью

    CTAPbIu_MABP,
    $sql = "SELECT * FROM restrictions WHERE word IN (".explode(" ",$message).") LIMIT 1";
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 17:32, спустя 35 минут 1 секунду

    AlexB, поудаляй все лишнее регуляркой /[^a-z]/
    Спустя 22 сек.
    phpdude, про лимит ты прав
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 17:41, спустя 9 минут 51 секунду


    AlexB, поудаляй все лишнее регуляркой /[^a-z]/

    Неа … там любые могут быть строки.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 17:45, спустя 3 минуты 38 секунд



    AlexB, поудаляй все лишнее регуляркой /[^a-z]/

    Неа … там любые могут быть строки.
    preg_split("#\s+#",$text); ? вроде как любые строки обработает)
    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 17:58, спустя 12 минут 50 секунд

    Гм, ну обработает, дальше что. Весь алгоритм не улавливаю …
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 2 февраля 2010 г. 18:03, спустя 5 минут 9 секунд


    я бы даже такое чтото заюзал, в принципе при индексах этот вариант будет обладать очень неплохой скоростью

    CTAPbIu_MABP,
    $sql = "SELECT * FROM restrictions WHERE word IN (".explode(" ",$message).") LIMIT 1";


    В таком вариант не пройдет проверку предложение, ведь "Хуй - это не палец" одна, а вот "Хуй, а не какой-то там палец" другое. Имею ввиду что есть уже разные строки ввида "Хуй" и "Хуй,", а следовательно нужно делать в данном случае две записи "плохих" слов + ещё и точка, восклицательный знак и т.д. Короче, сей вариант не вариант.
    Нужно таки писать свой морфологизатор (скопировал это слово с поста Эда, потому как самому написать без ошибок не удалось, сцуко). И весь прикол в том, что пока неизвестны задачи АлексаБи, то и алгоритм подсказать ему очень трудно (ведь предложенный алгоритм "мато-слов" ему не подходит, ещё что-то тоже, а потому неизвестно в какую сторону шагать).
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 18:06, спустя 3 минуты 9 секунд


    Гм, ну обработает, дальше что. Весь алгоритм не улавливаю …
    ну разбиваем на слова, потому мускулю (я бы скармливал частями, например по 500 слов) эти слова через where word IN () limit 1, и если хоть одно совпадение есть - говорим "мол ахуел чтоли? не ругайся пидорас!". это будет выгоднее, чем пословно сравнить базу с каждый из слов (тут все дело в колве слов в базе, если их 10к, то быстрее будет мускуль напрячь, если их 100, то проще циклом 100 слов проверить)
    Спустя 66 сек.
    Givi, ну добавь в регулярку изспользуемые слова да и все, знаков припинаний не так много, или наоборот перечислить возможные буквенные комбинации, тоже в принципе вариант
    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 18:11, спустя 4 минуты 55 секунд

    Да бог с ним написанием и морфологией. Дело не в мате и не в словах. Наверно я плохо объяснил.

    Задача простая:
    Cодержит строка подстроку - проверку не прошла.
    Не содержит - прошла.

    Т.е. если в базе два слова "Хуй", "Пизда" русскими буквами то
    "Хуй - это не палец", "Хуй, а не какой-то там палец", "Хуйня, а не палец" - не должны проходить
    "хуй - это не палец", "Хyй - это не палец" (X,y - латинские) - должны проходить
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 18:10, спустя 23 часа 59 минут 11 секунд

    АлексаБи

    АлексБи   =)))))
    блин не жгите так =)))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 18:13, спустя 3 минуты 11 секунд


    АлексаБи

    АлексБи   =)))))
    блин не жгите так =)))
    тоже заметил и поржал))) сразу не заметил
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 2 февраля 2010 г. 18:19, спустя 5 минут 20 секунд

    SELECT * FROM restrictions WHERE '".$str."' LIKE %restrictions.word% LIMIT 1

Пожалуйста, авторизуйтесь, чтобы написать комментарий!