2

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

 }

}

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

4

2 回答 2

5

ctype_alnum是地区相关的。这意味着如果您使用标准C语言环境或常见语言环境,例如en_US,则不会匹配重音字母,仅[A-Za-z]. 您可以尝试将语言环境设置为可以识别这些派生的语言setlocale(请注意,语言环境需要安装在您的系统上,并且并非所有系统都相同),或者使用更便携的解决方案,例如:

function ctype_alnum_portable($text) {
    return (preg_match('~^[0-9a-z]*$~iu', $text) > 0);
}
于 2012-04-04T12:15:51.883 回答
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;
}
于 2014-10-23T01:51:07.133 回答