PHPのお勉強!

PHP TOP

strcasecmp

(PHP 4, PHP 5, PHP 7, PHP 8)

strcasecmp大文字小文字を区別しないバイナリセーフな文字列比較を行う

説明

strcasecmp(string $string1, string $string2): int

大文字小文字を区別しないバイナリセーフな文字列比較を行います。 ここで行う比較は、ロケールを考慮しません。 つまり、ASCII文字だけが、大文字小文字を区別せず比較されます。

パラメータ

string1

最初の文字列。

string2

次の文字列。

戻り値

string1string2 より小さい場合は -1string1string2 より大きい場合は 1、等しい場合は 0 を返します。

変更履歴

バージョン 説明
8.2.0 これより前のバージョンで負の数と正の数を返していた場合に、 この関数は -11 を返すようになりました。

例1 strcasecmp() の例

<?php
$var1
= "Hello";
$var2 = "hello";
if (
strcasecmp($var1, $var2) == 0) {
echo
'$var1 is equal to $var2 in a case-insensitive string comparison';
}
?>

参考

  • strcmp() - バイナリセーフな文字列比較
  • preg_match() - 正規表現によるマッチングを行う
  • substr_compare() - 指定した位置から指定した長さの 2 つの文字列について、バイナリ対応で比較する
  • strncasecmp() - バイナリセーフで大文字小文字を区別しない文字列比較を、最初の n 文字について行う
  • stristr() - 大文字小文字を区別しない strstr
  • substr() - 文字列の一部分を返す

add a note

User Contributed Notes 4 notes

up
28
chris at cmbuckley dot co dot uk
12 years ago
A simple multibyte-safe case-insensitive string comparison:

<?php

function mb_strcasecmp($str1, $str2, $encoding = null) {
if (
null === $encoding) { $encoding = mb_internal_encoding(); }
return
strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding));
}

?>

Caveat: watch out for edge cases like "ß".
up
20
chrislarham at NOSPAM dot outlook dot com
6 years ago
I didn't see any explanation in the documentation as to precisely how the positive/negative return values are calculated for unequal strings.

After a bit of experimentation it appears that it's the difference in alphabetical position of the first character in unequal strings.

For example, the letter 'z' is the 26th letter while the letter 'a' is the 1st letter:

<?php

$zappl
= "zappl";
$apple = "apple";

echo
strcasecmp($zappl, $apple); #outputs 25 [26 - 1]
echo strcasecmp($apple, $zappl); #outputs -25 [1 - 26]

?>

This might be incredibly obvious to most people, but hopefully it will clarify the calculation process for some others.
up
9
Anonymous
22 years ago
The sample above is only true on some platforms that only use a simple 'C' locale, where individual bytes are considered as complete characters that are converted to lowercase before being differentiated.

Other locales (see LC_COLLATE and LC_ALL) use the difference of collation order of characters, where characters may be groups of bytes taken from the input strings, or simply return -1, 0, or 1 as the collation order is not simply defined by comparing individual characters but by more complex rules.

Don't base your code on a specific non null value returned by strcmp() or strcasecmp(): it is not portable. Just consider the sign of the result and be sure to use the correct locale!
up
4
alvaro at demogracia dot com
14 years ago
Don't forget this is a single-byte function: in Unicode strings it'll provide incoherent results as soon as both strings differ only in case. There doesn't seem to exist a built-in multi-byte alternative so you need to write your own, taking into account both character encoding and collation.