У меня есть эта странная проблема с функцией PHP CTYPE_ALNUM
если я сделаю:
PHP:
$words="àòè"; if(ctype_alnum($words)){ Echo "Don't work"; }else{ Echo "Work"; }
это будет означать «Работа»,
НО, если у меня есть форма и в этой форме я вставляю буквы с могилой, подобной (à, è, ò), это выведет «Не работать»,
Код:
<form action="" method="post"> <input type="text" name="words" /> <input type="submit" /> </form> $words=$_POST['words']; if(isset($words)){ if(ctype_alnum($words)){ Echo "Don't Work"; }else{ Echo "Work"; } }
Если я вставляю в текстовый ввод буквы à или è или ò, это выведет «Не работать»,
ctype_alnum
является зависимым от языка. Это означает, что если вы используете стандартный языковой стандарт C
или обычный, например en_US
, который не будет соответствовать акцентированным буквам, то только [A-Za-z]
. Вы можете попробовать установить языковой стандарт на язык, который распознает эти деривации через setlocale
(остерегайтесь того, что языковой стандарт должен быть установлен в вашей системе, а не все системы похожи) или использовать более портативное решение, такое как:
function ctype_alnum_portable($text) { return (preg_match('~^[0-9a-z]*$~iu', $text) > 0); }
Если вы хотите проверить все символы, определенные в стандарте Unicode, попробуйте следующий код. Я встретил ложное обнаружение в Mac OSX.
//setlocale(LC_ALL, 'C'); setlocale(LC_ALL, 'de_DE.UTF-8'); for ($i = 0; $i < 0x110000; ++$i) { $c = utf8_chr($i); $number = dechex($i); $length = strlen($number); if ($i < 0x10000) { $number = str_repeat('0', 4 - $length).$number; } if (ctype_alnum($c)) { echo 'U+'.$number.' '.$c.PHP_EOL; } } function utf8_chr($code_point) { if ($code_point < 0 || 0x10FFFF < $code_point || (0xD800 <= $code_point && $code_point <= 0xDFFF)) { return ''; } if ($code_point < 0x80) { $hex[0] = $code_point; $ret = chr($hex[0]); } else if ($code_point < 0x800) { $hex[0] = 0x1C0 | $code_point >> 6; $hex[1] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]); } else if ($code_point < 0x10000) { $hex[0] = 0xE0 | $code_point >> 12; $hex[1] = 0x80 | $code_point >> 6 & 0x3F; $hex[2] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]); } else { $hex[0] = 0xF0 | $code_point >> 18; $hex[1] = 0x80 | $code_point >> 12 & 0x3F; $hex[2] = 0x80 | $code_point >> 6 & 0x3F; $hex[3] = 0x80 | $code_point & 0x3F; $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]).chr($hex[3]); } return $ret; }