我已经看到正则表达式为包含基本ASCII字符的语言进行字符串验证,但这会区别于其他字母表:中文,日文,西里尔文,阿拉伯文等。
用于在多语言网站上进行用户输入。 我可以告诉预期的输入语言,它应该限制该字母表字符的输入。
这甚至可行吗? 有人知道进行这种验证的现有库吗?
如果基于区域设置的白名单方法不现实,是否有一个简单的通用黑名单解决方案来阻止所有或至少最常见的特殊字符? (那些不是任何语言环境成员的字母。)
提前感谢任何想法。
答案 0 :(得分: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";
}
将匹配一个字符串,其中包含ASCII 0到27的字符。
所以唯一真正的努力是让所有的Unicode块都失效:
{{1}}