2016-05-30 11 views
3

私は基本的なASCII文字をカバーする言語の文字列の検証を行っている正規表現を見てきましたが、それは、他のアルファベットの元を判別する:中国語、日本語、キリル文字、アラビア語などPHPでロケールに基づいて文字列を検証する方法を教えてください。

は、それにはかなりの多言語サイト上でのユーザー入力のためです。 予想される入力言語は、そのアルファベットの文字の入力を制限する必要があることに基づいて判断することができます。

それは実現可能ですか? 誰かがこの種の検証を行う既存のライブラリを知っていますか?

ロケールに基づくホワイトリストアプローチが現実的でない場合、すべての、または少なくとも最も一般的な特殊文字をブロックするためのシンプルな汎用ブラックリストソリューションがありますか? (ロケールのアルファベットのメンバーではないもの)

ありがとうございました。

+0

、無意味です。指定された文字列があなたのために無効になる基準は何ですか?日本語のユーザーが英語の文字を入力できないのですか?アラビア語のユーザーは西洋の数字を入力できないのですか? –

+0

こんにちは、フィードバックのおかげで、私はPHPのフィルタの機能を検証する参照しようとしていた:http://php.net/manual/en/filter.filters.validate.php - そう刺すときにドット、コンマ、ハッシュタグ、アンパサンドなど、特定のロケール上の実際のアルファベット文字ではありません。日本人が英語の文字を書くことを防ぐという事実は重要ではない。 – Mike

+0

'FILTER_VALIDATE_BOOLEAN'、' FILTER_VALIDATE_EMAIL'、 'FILTER_VALIDATE_FLOAT' ...がどのようにアルファベットの影響を受けるのかまだ分かりません。確かに、ユーザは例えばFLOATをタイプすることができる。スペイン語のロケール '1.123,56'ですが、私はその"文字列検証 "とは言いません。実装したいと思う特定の機能がありますか? –

答えて

0

これは、文字範囲に対して正規表現チェックを使用すると、非常に簡単な作業です。例えば、/^[\x{0}-\x{1b}]*$/uは27

だから、唯一の本当の努力がダウンして、すべてのUnicodeブロックを取得しているにASCII 0から文字の文字列にマッチします:

単語がさらにコンテキストなしで、「検証」
<?php 
class UnicodeBlockCheck 
{ 
    const ADLAM = [0x1E900, 0x1E95F]; 
    const AGEAN_NUMBERS = [0x10100, 0x1013F]; 
    const AHOM = [0x11700, 0x1173F]; 
    const ALCHEMICAL_SYMBOLS = [0x1F700, 0x1F77F]; 
    // and so on 

    private $block; 

    public function __construct($block) 
    { 
     if (!is_array($block) || $block[1] <= $block[0]) { 
      throw new Exception("Bad character range passed!"); 
     } else { 
      $this->block = $block; 
     } 
    } 

    public function isValid($string) 
    { 
     $st = dechex($this->block[0]); 
     $fi = dechex($this->block[1]); 
     $pattern = '/^[\x{' . $st . '}-\x{' . $fi . '}]*$/u'; 
     return preg_match($pattern, $string); 
    } 
} 

$bc = new UnicodeBlockCheck(UnicodeBlockCheck::ALCHEMICAL_SYMBOLS); 
if ($bc->isValid("")) { 
    echo "Valid characters"; 
} else { 
    echo "Invalid characters"; 
} 
関連する問題