2012-04-04 3 views
2

у меня есть эта странная проблема с функцией PHP ctype_alnumСтранная вещь с 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

Что кодирует файл? – zerkms

+0

Что делает 'print_r ($ words)' show? – MichaelRushton

+0

он точно показывает букву, которую я пишу, если я напишу èèè, это показать èèè – LdB

ответ

4

ctype_alnum локали-зависимые от. Это означает, что если вы используете стандартный C языковой стандарт или обычный, например en_US, это не соответствует буквам с акцентом, только [A-Za-z]. Вы можете попробовать установить локаль язык, который распознает эти выкладки с помощью setlocale (учтите, что локаль должна быть установлена ​​в вашей системе, а не все системы одинаковы), или использовать более портативное решение, как:

function ctype_alnum_portable($text) { 
    return (preg_match('~^[0-9a-z]*$~iu', $text) > 0); 
} 
+0

ok, я сделаю некоторые попытки, также если это очень странно XD – LdB

+0

Аликс, я считаю, что регулярное выражение, которое вы использовали, не идеально. preg_math ('~^[0-9a-z] * $ ~ iu', "Lajos Árpád") вернет 0. –

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