2017-03-11 10 views
-1

それがデフォルトロケールに基づいて異なる動作をしますので、私はctype_alnum()を常にを避ける:ctype_digit()はデフォルトのロケールを使用していますか?

setlocale(LC_ALL, 'fr_FR'); 

$char = "\xe9"; // LATIN SMALL LETTER E WITH ACUTE (ISO-8859-1) 
var_export(ctype_alnum($char)); // true 

を私が代わりにpreg_match('/^[a-zA-Z0-9]+$/')を使用する理由、それは一貫して唯一のASCII文字を受け入れるため、どのようなロケールセットのこと。

ctype_digit()と同様の警告がありますか?

0-9 ASCII数字以外の文字は使用できますか?

答えて

0

@Aziz Salehコメントに続いて編集されました。

すべてのctype関数は、文字または文字列が現在のロケール(setlocale()も参照)に従って特定の文字クラスに含まれるかどうかをチェックします)。 (https://secure.php.net/manual/en/intro.ctype.phpから)

+0

特にPHPのドキュメントを信頼しているとは限りません。特に、情報を省略すると*です。それがロケールに依存しないことが明確に文書化されていれば、確かにそれを信じるでしょう。 – Benjamin

+1

合意した@ベンジャミンしかし、この場合は、ドキュメントまたはGoogle以外では何も表示されていません。 – Gab

+0

Ctype関数は、開始以来常にロケールを反映しています。 –

0

ctype関数はドキュメントに従って同じように動作します。

この拡張機能で提供される関数は、文字または文字列が現在のロケール(setlocale()も参照)に従って特定の文字クラスに含まれるかどうかをチェックします。

出典:http://php.net/manual/en/intro.ctype.php

これはctype_digitはまた、非ASCII数字を受け入れる可能性があることを意味します。

私は唯一のオプションは、正規表現に固執するか、コードの前にデフォルトのロケールが設定されていることを確認することです(可変でない場合)。

関連する問題