動かざることバグの如し

近づきたいよ 君の理想に

PHPで大文字を小文字に変換とか小文字を大文字に変換しようとする

mb_convert_caseメソッドだけ知っていれば最強、そう思っていた時期がぼくにもありました。

大文字を小文字に変換

<?php
echo strtolower('HELLO mĄkA!');
// hello mĄka!

echo mb_strtolower('HELLO mĄkA!', 'UTF-8');
// hello mąka!

echo mb_convert_case('HELLO mĄkA!', MB_CASE_LOWER, "UTF-8");
// hello mąka!

strtolowerUnicodeに対応してないが故に他のメソッドと挙動が異なる

小文字を大文字に変換

<?php
echo strtoupper('hello mąka!');
// HELLO MąKA!

echo mb_strtoupper('hello mąka!', 'UTF-8');
// HELLO MĄKA!

echo mb_convert_case('hello mąka!', MB_CASE_UPPER, "UTF-8");
// HELLO MĄKA!

これも同じく

単語の最初の文字だけ大文字に変換

これが結構厄介

<?php
$str = "HELLO-TĄRO@gmail.com";
echo ucfirst($str);
// HELLO-TĄRO@gmail.com

echo ucwords($str);
// HELLO-TĄRO@gmail.com

echo mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
// Hello-Tąro@gmail.com

ucfirst()ucwords()の違いがイマイチ分からないが、公式ドキュメントいわく、

  • ucfirst : 文字列の最初の文字を大文字にする
  • ucwords : 文字列の各単語の最初の文字を大文字にする

とのこと。実際「hello, world」を試すとucfirst()Hello, worldを返す一方でucwords()Hello, Worldと返す。というのもucwords()はスペース、フォームフィード、改行、キャリッジリターン、 水平タブ、垂直タブの直後にある文字を単語として人気するからである。(公式ドキュメント見ればわかるが単語の区切りをオプションで指定可能)

異彩を放っているのがmb_convert_case()Unicodeに対応しているだけではなく、ハイフンの後も大文字に変換している。これは使いようによって異なるが気遣いがいいのはmb_convert_case()だと思う