PHP - 英語以外の文字を検出し、入力をフィルタリング
-
21-09-2019 - |
質問
私は人々があまりにも外国語で書くことができるようにしたいと思いますコメントフォームがあります。 しかし、例えば、私のスパムフィルタリングメカニズムは言葉、それは(ある英語母音)それには母音を持っていないという理由だけで「ETE」として何かnaiiveをブロックする。
以下のように母音を検出するための正規表現を使用した場合、私の質問は、あります:
$pattern = '/[aeiou]/';
私は単に
を書き込むことはできません$pattern = '/[aeiouéáíúó...]/';
と、サーバはそのほかに解釈します。 をどのように私はそれがうまく解釈されていることを?の
この操作を行うことができますロシア語やヘブライ語、のなどの非ラテンアルファベットの場合、私は、コンテンツが属する言語を検出し、適切なスパムフィルタリングメカニズムを実行できるという方法がありますか?の
「gjkdkgahg」または「TTT」、それが公開さページです。全体のスパムフィルタの目的は、のようなものをブロックすることです。
解決
$pattern = '/[aeiouéáíúó]/';
使用u
修飾子のUnicodeを取得します-aware正規表現、それはあなたがあなたが本当にする必要がありますあなたのアプリ、全体でUTF-8文字列で作業していると仮定すると、動作するはずです。
は、ロシア語、ヘブライ語などの非ラテンアルファベットに関しては、Iコンテンツが属する言語を検出し、適切なスパムフィルタリング機構を行うことができる方法はありますか?
基本的なロシアは、Unicode範囲U + 0400-U + 04FFに発見されました。母音はаэыуояеёюиです。ヘブライ語は、範囲U + 0590-U + 05FFであり、同じように母音を使用していません。私はあなたがいる限り、あなたが明確な単語の境界を持つ言語に固執するとして、多くの言語をカバーするシンプルな辞書でより多くの運を持っているかもしれません...母音を検出することが恐ろしく便利だとは思いません。中国のためあまり使用ます。
私はこの種のものは、すべての良いアンチスパムメカニズムであるとは思いません。それはすべての非常に多くの場合、適切な言葉の後でスパムを発見することですように、それは偽陽性にとして可能性があります。スポイラーフィールド(空白のままにする必要がありますが、ボットによるものではないだろうCSS-隠さ入力)と1-使用または期間限定の提出トークン様々な効果があることがはるかに可能性があります。
他のヒント
あなたは、アクセント記号付きの文字列を検索するために正規化するを使用することができます:
<?
if (! normalizer_is_normalized($input)) {
// handle non-normalized input
}
?>
必要に応じて、あなたも母音を検索するための正規の文字列に、このクラスを使用することができます:
<?
$norm = normalizer_normalize($input);
if (! preg_match('/[aeiou]/', $norm)) {
// handle no-vowels in input
}
?>
また、デフォルトの正規化形式について読むと必ずそれを満たす要件ことを確認したいと思う。
うーん、個人的に私はあなたのようなスパムフィルタがあまりにも効果的な見つけることはありません。 IMOそれはスパムが、多くの場合、それらを含む、リンク、強い言葉、そして性的/海賊版関連の単語を見てはるかに優れています。彼らは信頼できない(=未登録ユーザからの)ソースから来る場合、あなたは正しいだけで登録されたユーザーのための称賛を制限することができ、それらが現れる前に、司会者としてそれらを削除することができます。