update page now

ctype_alnum

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_alnumCheck for alphanumeric character(s)

Description

ctype_alnum(mixed $text): bool

Checks if all of the characters in the provided string, text, are alphanumeric.

Parameters

text

The tested string.

Note:

If an int between -128 and 255 inclusive is provided, it is interpreted as the ASCII value of a single character (negative values have 256 added in order to allow characters in the Extended ASCII range). Any other integer is interpreted as a string containing the decimal digits of the integer.

Warning

As of PHP 8.1.0, passing a non-string argument is deprecated. In the future, the argument will be interpreted as a string instead of an ASCII codepoint. Depending on the intended behavior, the argument should either be cast to string or an explicit call to chr() should be made.

Return Values

Returns true if every character in text is either a letter or a digit, false otherwise. When called with an empty string the result will always be false.

Examples

Example #1 A ctype_alnum() example (using the default locale)

<?php
$strings
= array('AbCd1zyZ9', 'foo!#$bar');
foreach (
$strings as $testcase) {
if (
ctype_alnum($testcase)) {
echo
"The string $testcase consists of all letters or digits.\n";
} else {
echo
"The string $testcase does not consist of all letters or digits.\n";
}
}
?>

The above example will output:

The string AbCd1zyZ9 consists of all letters or digits.
The string foo!#$bar does not consist of all letters or digits.

See Also

add a note

User Contributed Notes 4 notes

up
97
thinice at gmail dot com
16 years ago
ctype_alnum() is a godsend for quick and easy username/data filtering when used in conjunction with str_replace().

Let's say your usernames have dash(-) and underscore(_) allowable and alphanumeric digits as well.

Instead of a regex you can trade a bit of performance for simplicity:

<?php
$sUser = 'my_username01';
$aValid = array('-', '_');

if(!ctype_alnum(str_replace($aValid, '', $sUser))) {
    echo 'Your username is not properly formatted.';
}
?>
up
11
marcelocamargo at linuxmail dot org
10 years ago
It is also important to note that the behavior of `ctype_alnum` differs according to the operating system. For UNIX-based operating system, if you pass a value that is not a string (or an overloaded object), independently of the value, it will always result in false. However, if we do the same on Windows, using, for example, -1 as literal (a minus and a number greater than 0), we'll have true as result.

<?php var_dump(ctype_alnum(-1));
// UNIX: bool(false)
// Windows: bool(true)
up
23
Anonymous
13 years ago
Quicktip: If ctype is not enabled by default on your server, replace ctype_alnum($var) with preg_match('/^[a-zA-Z0-9]+$/', $var).
up
0
luismartin at casfid dot com
17 hours ago
Be aware that this function will not validate non-english alphanumeric characters. Only ASCII.

<?php
$test = "aeiou";
echo ctype_alnum($test) ? "ok\n" : "err\n";
$test = "áeiou";
echo ctype_alnum($test) ? "ok\n" : "err\n";
$test = "aeiöu";
echo ctype_alnum($test) ? "ok\n" : "err\n";
$test = "ñ";
echo ctype_alnum($test) ? "ok\n" : "err\n";

// output:
// ok
// err
// err
// err
?>

In case you want to validate these types of characters, the best choice is the use of regex, but there's a shortcut so that you will not have to bother typing all of them:

This regex: /^[\p{L}\p{M}\p{Nd}]+$/u
\p{L}  = Any letter, syllable, or ideogram from any Unicode script.
\p{M}  = Any combining mark (necessary for vowels/accents in languages like Arabic or Hindi).
\p{Nd} = Any decimal digit (0-9) from any script, excluding fractions like ½ or Roman numerals.
u = The modifier at the end says: treat the string as a UTF-8 representation.

<?php
$test = "aeiouáöñçسअ爱";
echo preg_match('/^[\p{L}\p{M}\p{Nd}]+$/u', $test) ? "ok\n" : "err\n";
$test = "aeiouáöñçسअ爱!+½";
echo preg_match('/^[\p{L}\p{M}\p{Nd}]+$/u', $test) ? "ok\n" : "err\n";

// output:
// ok
// err
?>
To Top