我对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";
}
}
如果我在文本输入中插入字母à或è或ò这将显示'不工作'
答案 0 :(得分:5)
ctype_alnum
是locale-dependend。这意味着,如果您使用的是标准C
语言区域或类似en_US
的常用语言区域,则不会匹配重音字母,只会[A-Za-z]
。您可以尝试将区域设置设置为通过setlocale
识别这些派生的语言(请注意,需要在系统上安装区域设置,并非所有系统都相同),或使用更便携的解决方案,如:
function ctype_alnum_portable($text) {
return (preg_match('~^[0-9a-z]*$~iu', $text) > 0);
}
答案 1 :(得分: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;
}