PHP - обнаружение неанглийских букв и фильтрация входных данных

StackOverflow https://stackoverflow.com/questions/1776476

  •  21-09-2019
  •  | 
  •  

Вопрос

Там есть форма для комментариев, где я бы хотел, чтобы люди тоже могли писать на иностранных языках.Но, например, мой механизм фильтрации спама заблокировал бы что-нибудь наивное вроде слова "été" просто потому, что в нем нет гласных (то есть английских гласных).

Мой вопрос заключается в том, что при использовании регулярного выражения для определения гласных, таких как:

$pattern = '/[aeiou]/';

Я не могу просто писать

$pattern = '/[aeiouéáíúó...]/';

и сервер бы это хорошо истолковал. Как я могу это сделать, чтобы это было хорошо интерпретировано?

Для нелатинских алфавитов, таких как русский и иврит, существует ли метод, с помощью которого я могу определить, к какому языку принадлежит контент, и выполнить соответствующий механизм фильтрации спама?

Цель всей фильтрации спама состоит в том, чтобы блокировать что-либо вроде:"gjkdkgahg" или "ttt", это общедоступная страница.

Это было полезно?

Решение

$pattern = '/[aeiouéáíúó]/';

Используйте u модификатор чтобы получить регулярное выражение с поддержкой Unicode, и это должно сработать, предполагая, что вы работаете со строками UTF-8 во всем вашем приложении, что и должно быть на самом деле.

Для нелатинских алфавитов, таких как русский и иврит, существует ли метод, с помощью которого я могу определить, к какому языку принадлежит контент, и выполнить соответствующий механизм фильтрации спама?

Базовый русский язык находится в диапазоне Unicode U + 0400–U + 04FF;vowels are аэыуояеёюи.Иврит находится в диапазоне U + 0590–U + 05FF и не использует гласные таким же образом.Я не думаю, что распознавание гласных ужасно полезно...возможно, вам повезет больше с простым словарем, охватывающим много языков, если вы будете придерживаться языков с четкими границами слов.Не так уж много пользы от китайского языка.

Я вообще не думаю, что подобные вещи являются хорошим механизмом защиты от спама.Вероятность ложноположительного результата так же высока, как и вероятность обнаружения спама, который, в конце концов, очень часто является правильными словами.Различные поля спойлера (CSS-скрытые входные данные, которые должны быть оставлены пустыми, но не будут использоваться ботами) и токены одноразового использования или отправки с ограниченным временем, с гораздо большей вероятностью будут эффективными.

Другие советы

Вы могли бы использовать нормализатор чтобы найти строки с символами с ударением:

<?
    if (! normalizer_is_normalized($input)) {
        // handle non-normalized input
    }
?>

При необходимости вы также можете использовать этот класс для нормализации строк для поиска гласных:

<?
    $norm = normalizer_normalize($input);
    if (! preg_match('/[aeiou]/', $norm)) {
        // handle no-vowels in input
    }
?>

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

Хм, лично я не нахожу такой спам-фильтр, как ваш, слишком эффективным.ИМО, гораздо лучше следить за ссылками, крепкими выражениями и словами, связанными с сексом / warez, они часто содержатся в спаме.Вы могли бы ограничить право на похвалу только для зарегистрированных пользователей, и вы могли бы удалить их как модератора до того, как они появятся, если они поступают из ненадежного (= от незарегистрированного пользователя) источника.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top