Я пытаюсь проверить ввод (aA-zZ & αΑ-ωΩ), я до сих пор придумал это из-за регулярного выражения и т. Д., Точно не работал с SQL-инъекцией XSS и 2-го порядка.
Но следующее оно печатает ошибку, потому что обрабатывает греческие символы («α») как 2 байтовых символа.
<?php validate_string_chars("aaαα"); function validate_string_chars($string) { //$valid_chars = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); //$valid_chars = range('a', 'z'); $english_low = range('a', 'z'); $english_cap = range('A', 'Z'); $greek_low = array('α', 'β'); $greek_cap = array('Α', 'Β'); $valid_chars = array_merge($english_low, $english_cap, $greek_low, $greek_cap); $errors = 0; for($i = 0; $i < strlen($string); $i++ ) { $char = substr($string, $i, 1); if (!in_array($char, $valid_chars)) { $errors++; } } echo "\n\r".$errors."\n\r"; } ?> // Results: 4 (2 errors for each "α")
Это $ char var_dump:
string(1) "a" string(1) "a" string(1) " " string(1) " " string(1) " " string(1) " "
Вам нужно использовать mb_strlen
и mb_substr
с кодировкой UTF8, чтобы правильно подсчитать число символов Unicode:
for($i = 0; $i < mb_strlen($string, 'UTF8'); $i++ ) { // <--- HERE $char = mb_substr($string, $i, 1, 'UTF8'); // AND HERE ---> if (!in_array($char, $valid_chars)) { $errors++; } }
См. Демонстрацию IDEONE
На самом деле, вы также можете сопоставлять графы Unicode с preg_match_all('/\X/u', $str, $matches)
где \X
– сокращенный класс для графемы Unicode .