2016-05-30 68 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將與字符的字符串匹配從ASCII 0到27

所以,唯一的真正的努力是獲得所有的Unicode板塊下跌:

<?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"; 
} 
相關問題