2016-05-30 71 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"; 
} 
相关问题