Я видел регулярные выражения, выполняющие проверку строк для языков, которые охватывают основные символы ASCII, но которые различают другие алфавиты, например: китайский, японский, кириллицу, арабский и т. Д.
Он предназначен для ввода пользователем на многоязычном сайте.
Я могу сказать ожидаемый язык ввода, основываясь на том, что он должен ограничивать ввод для символов этого алфавита.
Это вообще возможно?
Кто-нибудь знает существующую библиотеку, которая выполняет такую проверку?
Если подход белого списка, основанный на локали, нереалистичен, существует ли простое общее решение черного списка, чтобы блокировать все или, по крайней мере, наиболее распространенные специальные символы? (Те, которые не являются членами алфавитов любой локали.)
Спасибо за любые идеи заранее.
Это довольно простая задача, использующая проверку регулярных выражений по диапазонам символов. Например, /^[\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";
}
Других решений пока нет …