PHP - обнаружение неанглийских букв и фильтрация входных данных
-
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, они часто содержатся в спаме.Вы могли бы ограничить право на похвалу только для зарегистрированных пользователей, и вы могли бы удалить их как модератора до того, как они появятся, если они поступают из ненадежного (= от незарегистрированного пользователя) источника.