The strcmp()
performs a case-sensitive comparison. If no case sensitivity is required, strcasecmp()
comes into play. It works as strcmp()
; however, it does not distinguish between uppercase and lowercase letters. The functions strncmp()
and strcasencmp()
can be used to only compare the first “n
” characters of two strings.
Comparing string using == or ===
Comparing strings seems like an easy task using the ==
operator for implicit type conversion (so '1' == 1
returns true
) or the ===
operator for type checking (so '1' === 1
returns false
). However, the first method is rather flawed because the type-conversions are not always turned into strings. For instance, 1 == '1twothree'
returns true
, because both values are converted into integers. Therefore, ===
is the way to go.
strcmp()
<?php //Syntax: strcmp(string $string1, string $string2): int
This function use for binary safe case sensitive string comparison and accepts two parameters:
$string1
first string and$string2
second string
This function returns:
0
if both $string1 and $string2 are equal< 0
if $string1 is less than $string2> 0
if $string1 is greater than $string2
<?php $string1 = 'aardvark'; $string2 = 'zebra'; echo strcmp($string1, $string2); // -1 echo strcmp($string1, "Zebra"); // 1 echo strcmp('mouse', 'mouse'); // 0 $compare = strcmp($string1, $string2); if ($compare > 0 ) echo "$string1 > $string2"; elseif ($compare < 0) echo "$string1 < $string2"; elseif ($compare === 0) echo "$string1 = $string2"; //Prints: aardvark < zebra
strcasecmp()
<?php //Syntax strcasecmp(string $string1, string $string2): int
This function is identical to strcmp
with one differnce, it is case insensitive.
Example: Comparing Strings
<?php $a = 'PHP'; $b = 'php'; echo 'strcmp(): ' . strcmp($a, $b) . '<br />'; echo 'strcasecmp(): ' . strcasecmp($a, $b);
Which outputs:
strcmp(): -1 strcasecmp(): 0
strncmp()
<?php //Syntax strncmp(string $string1, string $string2, int $length): int
This function takes a third argument $length
that restricts the comparison to length characters. These examples show the results of various comparisons:
<?php echo strncmp("aardvark", "aardwolf", 4).'<br>'; // 0 echo strncmp("aardvark", "aardwolf", 5).'<br>'; // -1
strncasecmp()
<?php //Syntax strncasecmp(string $string1, string $string2, int $length): int
The function strncasecmp()
is case-insensitive version of strncmp()
function.
<?php echo strncmp("Aardvark", "aardwolf", 4); // -1 echo strncasecmp("Aardvark", "aardwolf", 4);// 0
The functions strcmp()
, strncmp()
, strcasecmp()
, or strncasecmp()
can be used as the callback function when sorting arrays with usort()
. More about custom array sorting can be found in “Sorting with a user-defined function“.
Checking Usernames and Passwords
When validating a username and a password (for example, a login form), two things seem to form a de facto standard on the Web:
- The password is always case-sensitive. It has to be provided exactly the same way it was set.
- The username, however, is not case-sensitive.
Therefore, a username has to be compared without considering case sensitivity. This can be done either by using strcasecmp()
or by first converting the provided username and the real username into lowercase letters (or uppercase letters). This is done by the functions strtolower()
or strtoupper()
. The preceding code shows an example, using strcmp()
/strcasecmp()
and also the compare operator ===
.
Validating Logins by Comparing Strings
<?php $user = $_POST['user']) ?? ''; $pass = $_POST['pass']) ?? ''; if ( (strtolower($user) === 'user1' && $pass === 'secret') || (strtoupper($user) === 'USER2' && $pass === 'verysecret') || (strcasecmp($user, 'User3') == 0 && strcmp($pass, 'topsecret') == 0) ) { echo 'Login successful.'; } else { echo 'Login failed.'; }
Working with Strings: