【PHP】 PHPの4種類の文字列と関数を把握しよう

PHPの文字列は、文字列リテラルや様々な操作するための関数などがあります。

文字列

PHPの文字列には、普通の文字列と、中に変数などを埋め込める文字列リテラル、複数行を簡単に書けるヒアドキュメント、ヒアドキュメントの普通の文字列版のNowdocの4種類があります。

普通の文字列

PHPでの普通の文字列はシングルクォーテーションで囲みます。また、\nのような特殊文字は全て無視されます。

$s = 'Hello, PHP World!!';
print($s);

$s = 'foo\nbar\nbaz';
print($s);
result
Hello, PHP World!!foo\nbar\nbaz

文字列リテラル

文字列リテラルでは、ダブルクォーテーションで囲った文字列の中に直接変数を埋め込んだり、特殊文字を埋め込めます。

特殊文字は一般的な特殊文字を使用でき、バックスラッシュでエスケープできます。\n\t\\などです。

変数を埋め込む際は、そのまま変数名を書くか、波括弧で囲んで変数名を書くと、文字列内に値を埋め込めます。$をエスケープするときは\$のように書きます。

$a = 100;
$b = "hoge\nfuga";

$s = "$a: $b \nhogehoge";
print($s);
result
100: hoge
fuga
hogehoge

また、${str}のように波括弧内に変数名を入れても動作します。この変数名自体が変数でも動作します。

$hoge = 'fuga';
$varname = 'hoge';
$s = "${hoge}\n${$varname}\n{$hoge}";

print($s);
result
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);
result
{strtolower(Hello, PHP World!!)}

しかし、関数を変数に入れる (つまり可変変数にする) ことで処理の対象となるため、様々な処理を実行することができます。 (分かりづらいのでほとんど使いません)

$s = 'Hello, PHP World!!';
$strtoupper = 'strtoupper';
$s = "{$strtoupper($s)}";

print($s);
result
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);
result
300
aは50以上

ヒアドキュメント

ヒアドキュメントでは、複数行の文字列を簡単に作成することができます。文字列内の挙動は、ダブルクォーテーションで囲った時と同じです。

<<<マーカーで開始し、最終行にマーカー;で終わります。

$hoge = 'abcde';

// <<<マーカー で開始し、最終行に マーカー; で終わる
$s = <<<EOS
foo
    bar
baz\n$hoge
EOS;

print($s);
result
foo
    bar
baz
abcde

変数の展開も行われていることが分かります。タブで字下げすると文字列に反映されるため、インデントには注意が必要です。

改行はコード上で直接行えますが、\nでも改行可能です。

上の例ではEOS (End Of String) をマーカーとしていますが、それ以外の文字でも問題ありません。

<<<HOGEHOGEで始まり、HOGEHOGE;で終わっても動作します。

Nowdoc

ヒアドキュメントの普通の文字列版です。つまりシングルクォーテーションで囲った時と同じ動作になります。

<<<'マーカー'で開始し、最終行にマーカー;で終わります。つまり開始でのマーカーをシングルクォーテーションで囲みます。

$hoge = 'abcde';

// <<<マーカー で開始し、最終行に マーカー; で終わる
$s = <<<EOS
foo
    bar
baz\n$hoge
EOS;

print($s);
result
foo
    bar
baz\n$hoge

コード上の改行は反映されていますが、特殊文字や変数の埋め込みは処理されていないことが分かります。

文字列の操作

様々なメソッドを利用して文字列を操作できます。かなり数が多いため、よく使うもののみ紹介します。

これら以外の関数は、PHPの公式ドキュメントにすべて載っています。

https://www.php.net/manual/ja/book.strings.php

文字列で分割 (explode)

explodeで文字列を分割できます。explode(区切り文字, 文字列, 最大区切り数)です。

分割用文字は分割すると消滅します。

$s = "hoge fuga hige foo bar";
$e = explode(" ", $s, 4);
print(implode("\n", $e));
result
hoge
fuga
hige
foo bar

最後の引数に4を指定しているため、最後の5つ目のスペースは分割されていないことが分かります。

ここで、分割文字列はその文字が連続している場合であり、ORではありません。

$s = "hoge fuga hige foo bar";
$e = explode("o ", $s);
print(implode("\n", $e));
result
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、それ以外の場合は &#xFFFD; となります。
ENT_DISALLOWED指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#xFFFD; で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401コードを HTML 4.01 として処理します。
ENT_XML1コードを XML 1 として処理します。
ENT_XHTMLコードを XHTML として処理します。
ENT_HTML5コードを HTML 5 として処理します。
https://www.php.net/manual/ja/function.htmlspecialchars.php

無効な符号単位シーケンスとは、文字ではないものです。例えば、\uFEFFは文字ではなくUTF-8のBOMです。

htmlspecialchars_decodeでは、ENT_IGNOREENT_DISALLOWED以外が利用できます。

デフォルトはENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401です。

$s = <<<EOS
<ul>
    <li><a href="//example.com">example</a></li>
</ul>
EOS;

print(htmlspecialchars($s));
result
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;//example.com&quot;&gt;example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

また、htmlspecialchars_decodeで戻すことができます。

$s = <<<EOS
<ul>
    <li><a href="//example.com">example</a></li>
</ul>
EOS;

$s = htmlspecialchars($s);
$s = htmlspecialchars_decode($s);

print($s);
result
<ul>
    <li><a href="//example.com">example</a></li>
</ul>

配列を文字列に連結 (implode, join)

implode(分割文字, 配列)とすると、配列を文字列に連結できます。要素の最後には分割文字が挿入されません。

joinimplodeの別名です。

implode(配列, 分割文字)はPHP8.0.0で削除されました

$ary = [1, 5, 2, 10, 51];
print(implode(", ", $ary));
result
1, 5, 2, 10, 51

改行前にbrを挿入 (nl2br)

nl2brを使用すると、改行前に<br>を挿入できます。

$s = <<<EOS
foo
bar
hoge
EOS;

print(nl2br($s));
result
foo<br />
bar<br />
hoge

特定の文字列を置換 (str_replace)

特定の文字列を別の文字列にしたい場合、str_replace(検索文字列, 置換後文字列, 元の文字列, 最大個数);で置換できます。最大個数のデフォルトはnull(無制限)です。

$s = "hoge fuga hige foo bar";
$s = str_replace(" f", "xyz", $s);
print($s);
result
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'));
result
19
9

前後のスペース削除 (trim)

trimrtrimltrimを用いると、文字列の前後につくスペースを削除できます。

ltrimは左のスペースを、rtrimは右のスペースを削除します。主にHTMLから送られてくるデータを処理する際などに使用します。

$s = '   hoge       ';
print(trim($s) . "|\n");
print(ltrim($s) . "|\n");
print(rtrim($s) . "|\n");
result
hoge|
hoge       |
   hoge|

まとめ

PHPの文字列では、特殊文字なども利用しない普通の文字列、変数や特殊文字を埋め込める文字列リテラル、改行も簡単に書けるヒアドキュメントとNowdocの4種類あります。

文字列を操作する関数は非常に数多くあるため、何かをしたい際は対応する関数がないかどうか調べることをおすすめします。

php string thumb

役に立ったらシェアしよう!