文字列操作

【PHP】大文字と小文字を区別せずに比較する二つの方法

更新日:2023/03/20

PHPは文字比較で大文字と小文字が考慮されます。
そのため、大文字と小文字を区別しないで比較するときは、少し工夫が必要です。

今回は、その方法を二つお伝えします。
どちらが好ましいという基準はないので、好きな方を使ってください。

 

大文字小文字の対象

念のため、今回対象となる文字を確認しておきます。

今回の対象となる文字は、アルファベットです。

日本語の小さい文字、例えば『ぁ』と大きな文字『あ』を同じ文字として比較することはできません。

 

方法1:strtolower()またはstrtoupper()を使う

一つ目の方法は、比較対象の文字を大文字または小文字に統一してから比較する方法です。

次の関数を使用します。

strtolower():文字列内の大文字を小文字に変換する → 全て小文字になる
strtoupper():文字列内の小文字を大文字に変換する → 全て大文字になる

次のように使用します。

$text1 = 'abCdeFg';
$text2 = 'AbcdEFG';

  // そのまま比較
echo $text1 === $text2 ? '同じ' : '違う';
 // 結果: 違う

  // 大文字に統一して比較
echo strtoupper($text1) === strtoupper($text2) ? '同じ' : '違う';
 // 結果: 同じ

そのまま比較すると異なる文字列と判断されますが、strtolower()で大文字に変換してから比較すると同じ文字列と判断されました。

念のため、日本語や記号が含まれていても比較できるか確認してみます。

$text1 = 'abCdあe#Fいg';
$text2 = 'AbcdあE#FいG';
  // 小文字に統一して比較
echo strtolower($text1) === strtolower($text2) ? '同じ' : '違う';
 // 結果: 同じ

今回は小文字に変換してから比較してみました。
同じ文字と判断されましたね。

 

方法2:strcasecmp()を使う

もう一つは、strcasecmp()を使う方法です。
この関数は引数で受け取った二つの文字を、大小の区別なしで比較します。

同じ文字のときは、0を返します。
異なるときは、-1または1を返します。

$text1 = 'abCdあe#Fいg';
$text2 = 'AbcdあE#FいG';

  // そのまま比較
echo strcmp( $text1 , $text2 ) === 0 ? '同じ' : '違う';
 // 結果: 違う

  // 区別しないで比較
echo strcasecmp( $text1 , $text2 ) === 0 ? '同じ' : '違う';
 // 結果: 同じ

最初に大文字と小文字を区別するstrcmp()で確認しています。
こちらは、異なる文字と判断しました。

一方strcasecmp()は、同じ文字と判断されました。

※指定文字数だけ大小を区別しないで比較する
strncasecmp()を使用すると、先頭から指定した文字数だけ比較してくれます。

$text1 = 'abcde12345';
$text2 = 'ABCDE99999';
  // 先頭から5文字だけ大小を区別しないで比較
echo strncasecmp($text1,$text2,5) === 0 ? '同じ' : '違う';
// 同じ

覚えておくと便利です。

 

正規表現で大文字小文字を区別しないで比較する

文字列の比較で正規表現を思い浮かべる人も多いと思います。
そこで正規表現についても、挙げておきます。

正規表現で大文字小文字を区別しないで比較するときは、iオプションを使用します。

$regex = '#B.D.F#i';

$text = 'abCdeFg';
preg_match( $regex , $text , $matches );

print_r( $matches );
// Array
// (
//     [0] => bCdeF
// )

iオプションの i は、"ignore case"i です。
Google翻訳で翻訳すると、「大文字と小文字を区別しない」と表示されました。
そのままですね。

更新日:2023/03/20

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。