PHP - İngilizce olmayan harfler ve filtreleme girişi tespit

3 Cevap php

There's a comment form where I'd want people to be able to write in foreign languages too. But, for example, my spam-filtering mechanism would block something naiive as the word "été" simply because it has no vowels in it (english vowels that is).

Gibi ünlüleri tespit için regex kullanarak benim soru ise:

$pattern = '/[aeiou]/';

Ben sadece yazmak değil

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

ve sunucu iyi olduğunu yorumlamak istiyorum. How can I do this so that it IS interpreted well?

Gibi non-latin alfabeler için rusça ve ibranice, is there a method that I can detect which language the content belongs to and perform an appropriate spam-filtering mechanism?

"Gjkdkgahg" veya "ttt", bir halka görünür sayfası: tüm spam filtreleme amacı gibi bir şey bloke etmektir.

3 Cevap

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

Unicode farkında regex almak için u modifier kullanın ve gerçekten olması gereken, size app boyunca UTF-8 dizeleri ile çalışıyoruz varsayarak, çalışması gerekir.

Rusça ve ibranice gibi latin olmayan alfabeler için, ben içerik ait hangi dili algılamak ve uygun bir spam filtreleme mekanizması yerine bir yöntem var mıdır?

Temel Rusça Unicode bulunan aralığını U +0400- U 04 FF; ünlüler аэыуояеёюи vardır. İbranice +0590- aralığı U U 05 FF ve aynı şekilde ünlüleri kullanmaz. Ben sürece net bir kelime sınırları var dillere sopa gibi, birçok dilde kapsayan basit bir sözlük ile daha şanslı olabilir ... ünlüleri tespit derece yararlı olduğunu sanmıyorum. Çok Çince için kullanmak değil.

Ben bu tür şeylerin hiç de iyi bir anti-spam mekanizması olduğunu sanmıyorum. Çok sık sonra tüm uygun kelime spam, nokta olduğu gibi yanlış pozitif olarak olasıdır. Spoiler alanlar (boş bırakılmalı, ancak botlar tarafından olmayacaktır CSS-gizli girişler) değişen ve bir kullanımlık veya sınırlı zamanlı sunulması belirteçleri çok daha büyük olasılıkla etkili olabilmesi için.

Sen aksanlı karakterler ile dizeleri bulmak için normalizer kullanabilirsiniz:

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

Gerekirse, aynı zamanda ünlüler için arama dizeleri normalleştirmek için bu sınıf kullanabilirsiniz:

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

Ayrıca varsayılan normalleştirme biçimi hakkında okumak ve ihtiyaçlarınızı karşıladığından emin olmak isteyeceksiniz.

Hmm, şahsen ben sizinki gibi bir spam filtresi çok etkili bulmuyorum. IMO bu bağlantıları, güçlü kelimeler ve cinsel / warez ilgili kelimeleri izlemek çok daha iyi olduğunu, istenmeyen sık sık onları içerir. Güvenilmeyen gelirse kaynak (kayıtsız kullanıcı =), Kayıtlı kullanıcılar için doğru sadece övmek kısıtlamak olabilir, ve onlar kadar göstermek önce moderatör olarak silmek olabilir.