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.';
}
?>ctype_alnum
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
ctype_alnum — Check for alphanumeric character(s)
Description
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.
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
- ctype_alpha() - Check for alphabetic character(s)
- ctype_digit() - Check for numeric character(s)
- setlocale() - Set locale information
- IntlChar::isalnum() - Check if code point is an alphanumeric character
User Contributed Notes 4 notes
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)Quicktip: If ctype is not enabled by default on your server, replace ctype_alnum($var) with preg_match('/^[a-zA-Z0-9]+$/', $var).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
?>