There doesn't actually seem to be a performance loss compared to using regexes. For example:
<?php
$sUser = 'my_username01';
$time_start1 = microtime(true);
$aValid = array('-', '_');
$ret1 = ctype_alnum(str_replace($aValid, '', $sUser));
$time_end1 = microtime(true);
$time1 = $time_end1 - $time_start1;
printf("Checked it with ctype_alnum and got %d in %.10f seconds\n", print_r($ret1, true), $time1);
$time_start2 = microtime(true);
$ret2 = preg_match('/^[\w-]+$/', $sUser);
$time_end2 = microtime(true);
$time2 = $time_end2 - $time_start2;
printf("Checked it with preg_match and got %d in %.10f seconds\n", print_r($ret2, true), $time2);
?>
This returns:
% time php ctype_alnum.php
Checked it with ctype_alnum and got 1 in 0.0000379086 seconds
Checked it with preg_match and got 1 in 0.0001120567 seconds
php ctype_alnum.php 0,01s user 0,01s system 84% cpu 0,024 total
% time php ctype_alnum.php
Checked it with ctype_alnum and got 1 in 0.0000400543 seconds
Checked it with preg_match and got 1 in 0.0001108646 seconds
php ctype_alnum.php 0,00s user 0,02s system 98% cpu 0,024 total
% time php ctype_alnum.php
Checked it with ctype_alnum and got 1 in 0.0000391006 seconds
Checked it with preg_match and got 1 in 0.0001142025 seconds
php ctype_alnum.php 0,02s user 0,01s system 98% cpu 0,024 total
ctype_alnum() seems to be consistently faster. I'm guessing that the preg engine initialization induces a bit of overhead.
ctype_alnum
(PHP 4 >= 4.0.4, PHP 5)
ctype_alnum — Vérifie qu'une chaîne est alphanumérique
Description
bool ctype_alnum
( string $text
)
ctype_alnum() vérifie si tous les caractères de la chaîne text sont des lettres et des chiffres. Elle retourne FALSE dans le cas contraire. En terme de langage C, les lettres sont [A-Za-z].
Liste de paramètres
- text
-
La chaîne testée.
Valeurs de retour
Retourne TRUE si tous les caractères de text sont soit des lettres, soit des chiffres, FALSE sinon.
Exemples
Exemple #1 Exemple avec ctype_alnum() (en utilisant les locales par défaut)
<?php
$strings = array('AbCd1zyZ9', 'foo!#$bar');
foreach ($strings as $testcase) {
if (ctype_alnum($testcase)) {
echo "La chaîne $testcase contient des chiffres ou des lettres.\n";
} else {
echo "La chaîne $testcase ne contient pas que des chiffres ou des lettres.\n";
}
}
?>
L'exemple ci-dessus va afficher :
La chaîne AbCd1zyZ9 contient des chiffres ou des lettres. La chaîne foo!#$bar ne contient pas que des chiffres ou des lettres.
Voir aussi
- ctype_alpha() - Vérifie qu'une chaîne est alphabétique
- ctype_digit() - Vérifie qu'une chaîne est un entier
- setlocale() - Modifie les informations de localisation
ctype_alnum
Josip Rodin
12-Aug-2009 04:13
12-Aug-2009 04:13
thinice at gmail dot com
22-Jul-2009 09:46
22-Jul-2009 09:46
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.';
}
?>
