【PHP】 PHPの4種類の文字列と関数を把握しよう
PHPの文字列は、文字列リテラルや様々な操作するための関数などがあります。
目次
文字列
PHPの文字列には、普通の文字列と、中に変数などを埋め込める文字列リテラル、複数行を簡単に書けるヒアドキュメント、ヒアドキュメントの普通の文字列版のNowdocの4種類があります。
普通の文字列
PHPでの普通の文字列はシングルクォーテーションで囲みます。また、\n
のような特殊文字は全て無視されます。
$s = 'Hello, PHP World!!'; print($s); $s = 'foo\nbar\nbaz'; print($s);
Hello, PHP World!!foo\nbar\nbaz
文字列リテラル
文字列リテラルでは、ダブルクォーテーションで囲った文字列の中に直接変数を埋め込んだり、特殊文字を埋め込めます。
特殊文字は一般的な特殊文字を使用でき、バックスラッシュでエスケープできます。\n
、\t
、\\
などです。
変数を埋め込む際は、そのまま変数名を書くか、波括弧で囲んで変数名を書くと、文字列内に値を埋め込めます。$
をエスケープするときは\$
のように書きます。
$a = 100; $b = "hoge\nfuga"; $s = "$a: $b \nhogehoge"; print($s);
100: hoge fuga hogehoge
また、${str}
のように波括弧内に変数名を入れても動作します。この変数名自体が変数でも動作します。
$hoge = 'fuga'; $varname = 'hoge'; $s = "${hoge}\n${$varname}\n{$hoge}"; print($s);
fuga fuga fuga
${hoge}
は、{hoge}
を処理するとhoge
となるため、最終的に$hoge
になり、更にこれが処理されてfuga
になります。- ${$varname}は、
{$varname}
を処理するとhoge
となるため、$hoge
になり、更にこれが処理されてfuga
になります。 - {$hoge}は、
{$hoge}
を処理すると値であるfuga
のみになります。
${$var}
のように、変数名を変数の値で指定する方法はメタプログラミングの基礎のようなものですので、知っておいて損はありません。
${$var}
という書き方は、文字列リテラルでなくても使えます。例えば、$f = ${$varname};
のようにできます。
つまり、$f = ${'ho' . 'ge'};
も可能です。
しかし$f = {$hoge};
は不可能で、仮にできても意味がありません。
関数周りの動作
文字列リテラル内に関数を書いても、通常は何も起こりません。
$s = "Hello, PHP World!!"; $s = "{strtolower($s)}"; print($s);
{strtolower(Hello, PHP World!!)}
しかし、関数を変数に入れる (つまり可変変数にする) ことで処理の対象となるため、様々な処理を実行することができます。 (分かりづらいのでほとんど使いません)
$s = 'Hello, PHP World!!'; $strtoupper = 'strtoupper'; $s = "{$strtoupper($s)}"; print($s);
HELLO, PHP WORLD!!
{ $strtoupper($s) }
のように、波括弧そばにスペースを入れると上手く動作しません。
実引数は普通に式が書け、さらにその中に文字列リテラルをそのまま埋め込めることを利用して、恒等関数を用いて様々な処理を行うこともできます。
$i = fn($v) => $v; $a = 100; $t = 50; $s = "{$i(100 + 200)}\n{$i($a >= $t ? "aは{$t}以上" : "aは{$t}未満")}"; print($s);
300 aは50以上
ヒアドキュメント
ヒアドキュメントでは、複数行の文字列を簡単に作成することができます。文字列内の挙動は、ダブルクォーテーションで囲った時と同じです。
<<<マーカー
で開始し、最終行にマーカー;
で終わります。
$hoge = 'abcde'; // <<<マーカー で開始し、最終行に マーカー; で終わる $s = <<<EOS foo bar baz\n$hoge EOS; print($s);
foo bar baz abcde
変数の展開も行われていることが分かります。タブで字下げすると文字列に反映されるため、インデントには注意が必要です。
改行はコード上で直接行えますが、\n
でも改行可能です。
上の例ではEOS
(End Of String) をマーカーとしていますが、それ以外の文字でも問題ありません。
<<<HOGEHOGE
で始まり、HOGEHOGE;
で終わっても動作します。
Nowdoc
ヒアドキュメントの普通の文字列版です。つまりシングルクォーテーションで囲った時と同じ動作になります。
<<<'マーカー'
で開始し、最終行にマーカー;
で終わります。つまり開始でのマーカーをシングルクォーテーションで囲みます。
$hoge = 'abcde'; // <<<マーカー で開始し、最終行に マーカー; で終わる $s = <<<EOS foo bar baz\n$hoge EOS; print($s);
foo bar baz\n$hoge
コード上の改行は反映されていますが、特殊文字や変数の埋め込みは処理されていないことが分かります。
文字列の操作
様々なメソッドを利用して文字列を操作できます。かなり数が多いため、よく使うもののみ紹介します。
これら以外の関数は、PHPの公式ドキュメントにすべて載っています。
文字列で分割 (explode)
explode
で文字列を分割できます。explode(区切り文字, 文字列, 最大区切り数)
です。
分割用文字は分割すると消滅します。
$s = "hoge fuga hige foo bar"; $e = explode(" ", $s, 4); print(implode("\n", $e));
hoge fuga hige foo bar
最後の引数に4
を指定しているため、最後の5つ目のスペースは分割されていないことが分かります。
ここで、分割文字列はその文字が連続している場合であり、ORではありません。
$s = "hoge fuga hige foo bar"; $e = explode("o ", $s); print(implode("\n", $e));
hoge fuga hige fo bar
HTMLをエスケープ (htmlspecialchars)
特にWebページ内に埋め込む際はエスケープしたい場合が数多くあります。
htmlspecialchars(文字列, flags, 文字コード)
と書きます。また、htmlspecialchars_decode
で戻せます。
flags
は、何をエスケープするかを決めるものです。それぞれのフラグの値はbitor (|
) で指定します。
値 | 説明 |
---|---|
ENT_COMPAT | ダブルクオートは変換しますがシングルクオートは変換しません。 |
ENT_QUOTES | シングルクオートとダブルクオートを共に変換します。 |
ENT_NOQUOTES | シングルクオートとダブルクオートは共に変換されません。 |
ENT_IGNORE | 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。 |
ENT_SUBSTITUTE | 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は � となります。 |
ENT_DISALLOWED | 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは � で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。 |
ENT_HTML401 | コードを HTML 4.01 として処理します。 |
ENT_XML1 | コードを XML 1 として処理します。 |
ENT_XHTML | コードを XHTML として処理します。 |
ENT_HTML5 | コードを HTML 5 として処理します。 |
無効な符号単位シーケンスとは、文字ではないものです。例えば、\uFEFF
は文字ではなくUTF-8のBOMです。
htmlspecialchars_decode
では、ENT_IGNORE
とENT_DISALLOWED
以外が利用できます。
デフォルトはENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401
です。
$s = <<<EOS <ul> <li><a href="//example.com">example</a></li> </ul> EOS; print(htmlspecialchars($s));
<ul> <li><a href="//example.com">example</a></li> </ul>
また、htmlspecialchars_decode
で戻すことができます。
$s = <<<EOS <ul> <li><a href="//example.com">example</a></li> </ul> EOS; $s = htmlspecialchars($s); $s = htmlspecialchars_decode($s); print($s);
<ul> <li><a href="//example.com">example</a></li> </ul>
配列を文字列に連結 (implode, join)
implode(分割文字, 配列)
とすると、配列を文字列に連結できます。要素の最後には分割文字が挿入されません。
join
はimplode
の別名です。
implode(配列, 分割文字)
はPHP8.0.0で削除されました
$ary = [1, 5, 2, 10, 51]; print(implode(", ", $ary));
1, 5, 2, 10, 51
改行前にbrを挿入 (nl2br)
nl2br
を使用すると、改行前に<br>
を挿入できます。
$s = <<<EOS foo bar hoge EOS; print(nl2br($s));
foo<br /> bar<br /> hoge
特定の文字列を置換 (str_replace)
特定の文字列を別の文字列にしたい場合、str_replace(検索文字列, 置換後文字列, 元の文字列, 最大個数);
で置換できます。最大個数のデフォルトはnull
(無制限)です。
$s = "hoge fuga hige foo bar"; $s = str_replace(" f", "xyz", $s); print($s);
hogexyzuga higexyzoo bar
文字列の長さを取得 (strlen, iconv_strlen)
strlen(文字列)
で文字列の長さを取得できます。ここで、文字列の長さというのは、バイト数のことです。(mb_strlen
では、第2引数に文字コードの指定ができ、デフォルトでは全角は長さ1の扱いです。)
文字数が欲しい場合、iconv_strlen
を使用します。第2引数には文字コードが入り、省略可能です。
$s = 'あいうえおhoge'; print(strlen($s) . "\n"); print(iconv_strlen($s, 'UTF-8'));
19 9
前後のスペース削除 (trim)
trim
、rtrim
、ltrim
を用いると、文字列の前後につくスペースを削除できます。
ltrim
は左のスペースを、rtrim
は右のスペースを削除します。主にHTMLから送られてくるデータを処理する際などに使用します。
$s = ' hoge '; print(trim($s) . "|\n"); print(ltrim($s) . "|\n"); print(rtrim($s) . "|\n");
hoge| hoge | hoge|
まとめ
PHPの文字列では、特殊文字なども利用しない普通の文字列、変数や特殊文字を埋め込める文字列リテラル、改行も簡単に書けるヒアドキュメントとNowdocの4種類あります。
文字列を操作する関数は非常に数多くあるため、何かをしたい際は対応する関数がないかどうか調べることをおすすめします。
