奇怪的是CTYPE_ALNUM

时间:2012-04-04 11:45:53

标签: php html

我对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";      

 }

}

如果我在文本输入中插入字母à或è或ò这将显示'不工作'

2 个答案:

答案 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;
}