2

PHP 関数 CTYPE_ALNUM にこの奇妙な問題があります

私が行った場合:

PHP:

$words="àòè";


if(ctype_alnum($words)){

   Echo "Don't work";

}else{

   Echo "Work";     

}

これは「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 に答える