この記事では、PHPでの文字列の基本的な使い方を解説したいと思います。
PHPでの文字列は、非常に簡単で直感的に扱うことができます。僕はPHPの前はC言語やC++を使っていたので、最初はあまりの簡単さに感動しました。
しかし、簡単である反面、いくつか注意しなければならない点もあるので、それも合わせて解説していきます。
目次
文字列の使い方
PHPで文字列を使うには、以下の4つの方法があります。
- 引用符(「’」シングルクォーテーション)で囲う
- 二重引用符(「”」ダブルクォーテーション)で囲う
- ヒアドキュメント構文
- nowdoc構文
以下に、それぞれについて詳しく解説します。
引用符(「’」シングルクォーテーション)
まずは、引用符(「’」シングルクォーテーション)で囲う方法です。
echo 'これは文字列です';
これは文字列です
基本的にはこれだけです。シンプルですね。
次に解説する二重引用符(「”」ダブルクォーテーション)とほとんど同じなのですが、大きな違いはエスケープシーケンスを使えない、変数の展開ができないという点です。
これについては次項で詳しく解説します。
尚、文字列中で「’」を使いたい場合は、以下のようにバックスラッシュ「\」でエスケープする必要があります。
echo 'I\'ll be back.';
I’ll be back.
二重引用符(「”」ダブルクォーテーション)
次に、二重引用符(「”」ダブルクォーテーション)で囲う方法です。書き方は引用符(「’」シングルクォーテーション)と同じです。
echo "これは文字列です";
これは文字列です
上にも書きましたが、シングルクォーテーションとの大きな違いは、エスケープシーケンスを使えるのと、変数の展開ができるという点です。
まずエスケープシーケンスとは、「\n」(改行)、「\t」(タブ)のような特殊文字です。
echo "これは文字列です\n改行します";
これは文字列です
改行します
仮にこれをシングルクォーテーションで書いた場合、実際の改行はされずに「\n」という文字列がそのまま出力されます。
echo 'これは文字列です\n改行します';
これは文字列です\n改行します
もう一つは、文字列中に変数の展開ができるという特徴があります。
$str = "文字列";
echo "これは{$str}です";
これは文字列です
このように、文字列の中に変数を埋め込むことができ、変数の中身が文字列中に展開されます。
上記の例では{}で変数を囲っていますが、これは省略できます。また、$を{}の外側に書いても動作します。
$str = "文字列";
echo "これは{$str}です";
echo "これは$strです";
echo "これは${str}です";
出力結果はすべて同じになります。
{}が無い場合、どこまでが変数なのか判断できない場合があるので、そのような場合に{}を付けます。
$cd = "cd";
// 変数名がcなのかcdなのかcdeなのかわからない
echo "ab$cde";
// 変数の範囲を明示できる
echo "ab{$cd}e";
{}が付いていた方が明示的に変数であるということがわかりやすいので、常に付ける癖をつけておいても良いと思います。
ヒアドキュメント構文
ヒアドキュメント構文は、複数行に渡るような長い文章を扱う場合に便利です。
$str = <<<TEXT
これはヒアテキスト構文です。
複数行に渡る文章を扱う場合に便利です。
変数を展開することもできます。
TEXT;
echo $str;
これはヒアテキスト構文です。
複数行に渡る文章を扱う場合に便利です。
変数を展開することもできます。
まず書き方ですが、「<<<」の後に任意のIDを指定し、文字列の終わりに同じIDとセミコロン「;」で閉じます。この時、終端のIDの前にスペースなどがあると動作しないので注意してください。
文字列中に含まれる改行は、そのまま改行として展開されますが、「\n」などのエスケープシーケンスを使うこともできます。また、変数を展開することも可能です。
つまり、中身は二重引用符(「”」ダブルクォーテーション)と同じ動作になります。
Nowdoc構文
Nowdoc構文はヒアドキュメント構文とほとんど同じなのですが、ヒアドキュメント構文が二重引用符(「”」ダブルクォーテーション)と同じ動作になるのに対して、Nowdoc構文は引用符(「’」シングルクォーテーション)と同じ動作になります。
この構文はPHP5.3.0以降でのみサポートされています。
$str = <<<'TEXT'
これはNowdoc構文です。
複数行に渡る文章を扱う場合に便利です。
変数を展開することはできません。
TEXT;
echo $str;
これはNowdoc構文です。
複数行に渡る文章を扱う場合に便利です。
変数を展開することはできません。
ヒアドキュメント構文との書き方の違いは、先頭のIDを「’」で囲うというだけです。
正直、Nowdoc構文はあまり使用したことがないです。
文字列の操作
次に、文字列の操作についてです。
よく使うのは、「結合」「切り取り」「検索」「置換」かと思いますので、それぞれについて簡単な例を交えて解説していきます。
文字列の結合
文字列の結合には、結合演算子「.」を使います。
$a = '文字列';
$b = '結合';
echo $a.'を'.$b.'するよ';
文字列を結合するよ
ちなみに、これは先ほどのダブルクォーテーションの解説で紹介した変数の展開でも同じ動作になりますので、どちらで書いても同じです。
$a = '文字列';
$b = '結合';
echo "{$a}を{$b}するよ";
また、「.=」という演算子を使うと、既存の文字列に別の文字列を追加することができます。
$a = "文字列";
$a .= "結合";
echo $a;
文字列結合
文字列の切り取り
文字列の一部分を切り取るには、substr()という関数を使います。
$str = 'abcde';
echo substr($a, 1, 3);
bcd
関数の詳細については公式マニュアルを参照してみてください。
http://php.net/manual/ja/function.substr.php
日本語の文字列に対して同様のことをしたい場合は、mb_substr()を使います。
$str = 'あいうえお';
echo mb_substr($str, 1, 3);
いうえ
文字列の検索
文字列を検索する方法は色々ありますが、最も単純なのはstrpos()という関数を使う方法かと思います。
$str = 'abcde';
$search = 'cd';
if(strpos($str, $search) !== false){
echo "文字列{$search}が見つかりました";
}else{
echo "文字列{$search}が見つかりませんでした";
}
注意点として、strpos関数は文字列が見つかった場合はその位置を、見つからなかった場合にfalseを返します。文字列の位置は0から始まりますので、先頭で見つかった場合には0が返ります。
つまり、比較演算子は「!=」ではなく「!==」を使用しなければ正しく動作しないという点に注意しましょう。
比較演算子の違いについては別記事で詳しく解説します。
また、正規表現を使ってより細かな検索を行いたい場合は、preg_match()という関数を使います。正規表現についてもいずれ別記事で詳しく解説する予定ですので、使用例は割愛します。
文字列の置換(削除)
文字列の置換も色々な方法がありますが、最も単純なのはstr_replace()という関数を使う方法です。
$str = '私はりんごが好きです';
$search = 'りんご';
$replace = 'みかん';
echo str_replace($search, $replace, $str);
私はみかんが好きです
上記の例では「りんご」を「みかん」に置換しています。
また、置換後の文字列を空文字にすれば文字列の削除ができます。
$str = '私はりんごが好きです';
$search = '私は';
$replace = '';
echo str_replace($search, $replace, $str);
りんごが好きです
文字列の置換についても、検索と同様に正規表現を使うことができ、その場合はpreg_replace()という関数を使います。
文字列を扱う際の注意点
最後に、PHPで文字列を扱う際につまずきがちな注意点をいくつか解説します。
文字コードに注意
まずWebエンジニアであれば誰もが一度は悩まされるであろう問題が、文字コードの問題です。
頑張ってコーディングしていざ動かしてみたら、文字化けで何も見えない。。みたいなことは僕も初心者の頃によくありました。
最近では文字コードはUTF-8で統一するのが一般的で問題も少ないと思います。
文字コードで悩まされたらまず以下の点を確認してみてください。
- HTMLのメタタグの「charset」
- phpの設定「Default_charset」
- データベースを使用する際はサーバーとクライアントそれぞれの文字コード設定
- ソースコードのファイル自体の文字コード
特に見落としがちなのが、最後のファイル自体の文字コードです。Windowsのメモ帳なんかでソースを保存すると、デフォルトでは文字コードはShift-jisになってしまいます。
秀丸エディタなど、ファイルの文字コードが見えるエディタで確認してみてください。
文字列の比較について
まず以下の例を見てください。
$a = 123;
$b = '123円';
if($a == $b){
echo '一致';
}else{
echo '不一致';
}
この出力結果はどうなると思いますか?
答えは「一致」です。
PHPでは、文字列の先頭に数値があると、演算や比較を行った際に数値として評価してしまうようで、このような動作になってしまいます。
文字列の比較を行う場合は、「===」で型を含めた比較を行うか、strcmp関数などを使うクセを付けておいた方が良いと思います。
文字列の話からは少しずれてしまうのですが、同様の問題で非常に多いのが、「0」と「空文字」と「NULL」と「FALSE」の比較で意図しない結果になってしまうケースです。
これらもすべて「==」では一致、「===」では不一致となります。
是非覚えておいてください。
結合と演算を混合に注意
これもまず例から見てください。
$var = 3;
echo "Result: " . $var + 3;
この処理の意図としては、「Result: 6」と出したいところなのですが、出力結果は「3」となります。
これは最初に文字列として結合された「Result: 3」に3が加算されるという動作になってしまうため、前半の文字列が数値の0として評価され、3という結果になるという理屈です。
正しくは以下のように()を付けて、「$var + 3」の部分が先に評価されるようにしましょう。()が優先されるのは、数学の数式と同じイメージです。
$var = 3;
echo "Result: " . ($var + 3);
また、「+」はJavascriptでは文字列を結合する演算子でもあります。PHPとJavascriptは一緒にコーディングすることも多いので、単純なケアレスミスという意味でも、混合に注意しましょう。
まとめ
最後に概要をまとめます。
- 「’」(シングルクォーテーション)はエスケープシーケンスや変数が使えない
- 「”」(ダブルクォーテーション)はエスケープシーケンスや変数が使える
- ヒアドキュメント構文は「”」(ダブルクォーテーション)と同じで複数行の扱いに便利
- nowdoc構文は「’」(シングルクォーテーション)と同じで複数行の扱いに便利
- 文字列の結合には「.」を使う
- 文字列の切り取りはsubstr()関数を使う
- 文字列の検索はstrpos()またはpreg_match()関数を使う
- 文字列の置換はstr_replace()またはpreg_replace()関数を使う
- PHPの設定やソースファイルの文字コードに注意
- 文字列の比較は型も含めて行うべし
- 文字列の結合と演算を混合する場合は式の評価順に注意
PHPで文字列を扱うことは非常に多いです。
是非正しい知識を身に付けておいてください。