PHPのstring型(文字列型)について、理解できていますか?
PHPに限らず、あらゆるプログラミング言語では、日本語や英語などの文字列をプログラム内で取り扱うために、文字列を格納するための型が用意されています。しかし、PHPの文字列ではシングルコートやダブルコートの違いが分からなかったり、文字列を操作する関数が多くて覚えるのに苦労する人も多いことでしょう。
そこで今回は、
・文字列の操作方法とよく利用する関数
について解説します。
目次
string型の基本
PHPでは、文字を取り扱うためのデータ型「string型」が用意されています。ここでは、string型を理解するうえで基本となる文字列リテラル、エスケープシーケンスについて解説し、PHPで文字列リテラルを表現するための方法について解説していましょう。
文字列リテラル(string literal)の意味
文字列リテラル(string literal)とは、PHPを含む多くのプログラミング言語で見られる、文字が0文字以上連続しているものです。PHPにおける文字列リテラルの例を以下のサンプルコードに示します。サンプルコード内で黄土色でハイライトされている部分が「文字列リテラル」です。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // シングルクオートなどで囲まれた文字列が「文字列リテラル」です。 $length = strlen('strlen関数に文字列リテラルを渡しています'); // 数字、アルファベット、記号、ひらがな、カタカナ、漢字など、さまざまな文字を取り扱えます。 $sample_str = '123,456,789'; $sample_str = 'Hello everyone.'; $sample_str = '!?()[]\\\\<>=~^"#$%'; $sample_str = 'ひらがな、カタカナ、漢字も取り扱える'; // 0文字の場合は特別に「空文字列」や「NULL文字列」と呼ばれる。 $empty_str = ''; |
文字列リテラルは、プログラム内において変数に格納したり、直接関数の引数として渡したりすることができます。特にPHPにおいては、HTMLタグを動的に生成する際に文字列リテラルを取り扱うことが頻繁にあるため、学びはじめの段階で理解することが重要です。
文字列リテラルにおける特別な文字
後述するシングルクオートやダブルクオートのように、文字によってはそのまま記述しても正常に取り扱えない場合があります。その場合は、バックスラッシュ「\」を利用して「\’」「\”」のように記述しましょう。このように、バックスラッシュから始まる特別な文字は「エスケープシーケンス」と呼ばれています。
エスケープシーケンスは、特殊な文字を文字列として解釈するために利用する他に、PHPによって生成されたHTMLコード内で改行やタブ入力をするときにも利用します。エスケープシーケンスによる文字列の記述例を、以下のサンプルコードに示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $br = '<br />'; // ①特殊な文字を文字列リテラルとして扱う場合のエスケープシーケンス(一部) // シングルクオート内でシングルクオートを文字列出力 echo '\'シングルクオート\''.$br; // ダブルクオート内でダブルクオートを文字列出力 echo "\"ダブルクオート\"".$br; // エスケープシーケンスを文字列として取り扱う場合は、 // バックスラッシュをエスケープシーケンスする echo "\\' バックスラッシュ(円マーク)".$br; // ②改行やタブを入力する場合のエスケープシーケンス(一部) // \n は、改行を示すエスケープシーケンス echo "こんにちは。\n 私の名前は阿部ひろしです。".$br; // \r は、水平方向のタブ入力を示すエスケープシーケンス echo "ありがとうございます。 \t どういたしまして。".$br; |
ブラウザで確認すると、①のエスケープシーケンスが正常に解釈され、記号が出力されていることが分かります。
一方、②のエスケープシーケンスはブラウザ上で動作確認することはできません。②のエスケープシーケンスは、HTMLのソースコード内でその動作を確認できます。開発者ツールでソースコードを見てみると、赤枠部分のように改行とタブ入力がされていることが確認できます。
文字列リテラルの表現方法
PHPで文字列リテラルを表現する方法は、以下の4種類があります。
方法 | 特徴 |
シングルクオートで囲む方法 | 変数を解析しない |
ダブルクオートで囲む方法 | 変数を解析し文字列リテラルに展開する |
Nowdocで表現する方法 | 複数行に渡って文字列リテラルを表現する 変数を解析しない |
ヒアドキュメントで表現する方法 | 複数行に渡って文字列リテラルを表現する 変数を解析し文字列リテラルに展開する |
シングルクオートで囲む方法
1つ目は、シングルクオートで囲む方法です。最もオーソドックスな文字列リテラルの表現方法で、特別な場合を除いてシングルクオートで囲まれた部分は、純粋に文字列リテラルとして解釈します。シングルクオートによる文字列リテラルの記述例を、以下のサンプルコードに示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $br = '<br/>'; // シングルクオートで文字列リテラルを表現 echo 'Hello everyone!'.$br; // エスケープシーケンスでシングルクオートを文字列リテラルとして表現 echo 'I\'m Abe Hiroshi.'.$br; // 一部のエスケープシーケンスは解釈せず文字列リテラルとして扱われる echo 'tab input (\t). \n new line.'.$br; // 変数の中身は解釈しない $text = '"Could you tell me about PHP?"'; echo 'He said $text'.$br; $value = 123; echo 'The value is $value.'.$br; |
ブラウザで確認すると、以下のように表示されます。一部のエスケープシーケンスや変数は解釈されず、そのまま文字列リテラルとして表示されていることが分かります。
ダブルクオートで囲む方法
2つ目は、ダブルクオートで囲む方法です。ダブルクオートも頻繁に利用される文字列リテラルの表現方法ですが、以下の2点がシングルクオートで表現する場合と異なります。
- 一部のエスケープシーケンスを解釈する。
- 変数を解析し、文字列リテラルとして解釈する。
ダブルクオートによる文字列リテラルの記述例を、以下のサンプルコードに示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $br = '<br/>'; // ダブルクオートで文字列リテラルを表現 echo "Hello everyone!".$br; // エスケープシーケンスでダブルクオートを文字列リテラルで表現 // ※シングルクオートはエスケープシーケンスせずにそのまま記述しても // 文字列リテラルとして解釈される。 echo "He said \"I'm Abe Hiroshi.\" ".$br; // 一部のエスケープシーケンスを解釈する // 動作確認するには、HTMLのソースコードを直接確認すること echo "tab input (\t). \n new line.".$br; // 変数の中身を解析し文字列リテラルとして扱う $text = '"Could you tell me about PHP?"'; echo "He said $text".$br; $value = 123; echo "The value is $value.".$br; |
ブラウザで確認した結果は、以下の通りです。1行目はシングルクオートと同様、2行目はエスケープシーケンスによってダブルクオートを文字列リテラルとして表示しています。また、4行目と5行目は、変数の中身を展開して表示していることが分かります。
3行目は、エスケープシーケンスが解釈されることにより、シングルクオートとは異なる表示結果となっています。開発者ツールで確認すると、赤枠部分のようにタブ入力と改行がされていることが分かります。
Nowdocで表現する方法
3つ目は、Nowdoc構文です。簡単な使い方を、以下のサンプルコードに示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // 「<<<」の後に終端文字列(EOD)をシングルクオートで囲みながら記述 echo <<< 'EOD' 阿部様 お世話になっております。 頼まれていた書類作成が完了いたしましたので、添付いたします。 お手数ですが、ご確認をお願いいたします。 佐藤太郎 EOD; // 終端文字列を記述するまで、文字列リテラルとして解釈 |
Nowdocは、シングルクオートやダブルクオートで表現するよりも可読性が高いため、長大な文字列を取り扱う際に最適です。機能としてはシングルクオートと同様で、エスケープシーケンスや変数の中身は解釈しません。
ただし、上記サンプルコードのように見やすく改行しても、ブラウザでは以下のように改行は反映されないことに注意してください。
ヒアドキュメントで表現する方法
4つ目は、ヒアドキュメントです。Nowdocと同様に終端文字列を利用して文字列リテラルを表現します。Nowdocと異なる点は以下の2点です。
- 終端文字列をシングルクオートで囲まない。
- 機能的には、ダブルクオートと同様に動作する。
ヒアドキュメントの記述例を、以下に示します。ダブルクオートと動作は同一であるため、変数の中身を展開して文字列を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $to_name = '阿部様'; $from_name = '佐藤太郎'; // 「<<<」の後に終端文字列(EOD)をそのまま記述 echo <<< EOD $to_name お世話になっております。 頼まれていた書類作成が完了いたしましたので、添付いたします。 お手数ですが、ご確認をお願いいたします。 $from_name EOD; // 終端文字列を記述するまで、文字列リテラルとして解釈 |
ブラウザ確認結果は、以下のようにNowdocの場合と同様です。
PHPのヒアドキュメントを使うには?EOFで囲む方法を解説します 【PHP初心者向け】ヒアドキュメントを使って文章をそのまま表示する方法文字列の操作方法
PHPでは、文字列に対してさまざまな操作を実行でき、文字列操作のための関数が用意されています。数が多いため、ここではよく利用する関数について、以下の7ジャンルに分類しながら解説します。
- 文字列の出力
- 文字列の長さの取得
- 文字列の連結
- 文字列の分割
- 文字列の切り出し
- 文字列の検索
- 文字列の置換
文字列の出力
PHPにおける文字列の出力は、出力先によって方法が異なります。よく利用される方法は以下の通りです。
出力先 | 方法 | 特徴 |
ブラウザ (HTMLファイルに出力してブラウザで表示する) |
echoを利用する | HTMLファイルに文字列を出力する。 |
var_dump関数を利用する | HTMLファイルに変数の諸情報を出力する。 | |
ログファイル | error_log関数を利用する | エラーログファイルに文字列を出力する。 |
上記3つの記述例を、以下のサンプルコードに示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $br = "<br />"; $display_str = "文字列を表示します"; // echo を使って文字列出力 echo "echo : ".$display_str.$br; // var_dump を使って文字列出力 var_dump($display_str); // エラーログファイルに文字列出力 error_log("error_log:".$display_str); |
なお、error_log関数を利用する際は、php.iniに以下のディレクティブを記述する必要があります。
1 |
error_log = C:\xampp\php\log\php_errors.log |
error_logは、エラーログファイルの出力場所とファイル名を指定するためのディレクティブです。
ブラウザの表示結果とログファイルの出力結果は、以下の通りです。var_dump関数では、変数の中身とともにデータ型と文字列長が表示されていることが分かります。
【PHP入門】echoによる文字列出力の方法と注意点を解説 【初心者向け】PHPのエラーを確認する方法!文字列の長さの取得
文字列の長さを取得する際には、文字列の何をカウントするかによって2通りのパターンがあります。
カウント方法 | 方法 |
バイト数をカウント | strlen関数を利用する |
文字数をカウント | mb_strlen関数を利用する |
各関数の使用例を以下に示します。バイト数をカウントする際は、文字コードの種類によって結果が異なることに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $br = "<br />"; $str = "Hello"; $str_mb = "おはよう"; // UTF-8からEUC-JPに変換 $str_mb_euc = mb_convert_encoding($str_mb, "EUC-JP"); // UTF-8からShift_JISに変換 $str_mb_sjis = mb_convert_encoding($str_mb, "Shift_JIS"); // バイト数をカウント echo "バイト数のカウント".$br; echo "\"$str\" length(strlen):".strlen($str).$br; echo "\"$str_mb\" length(strlen, UTF-8):".strlen($str_mb).$br; echo "\"$str_mb\" length(strlen, EUC-JP):".strlen($str_mb_euc).$br; echo "\"$str_mb\" length(strlen, Shift_JIS):".strlen($str_mb_sjis).$br; // 文字数をカウント echo $br; echo "文字数のカウント".$br; echo "\"$str\" length(mb_strlen):".mb_strlen($str).$br; echo "\"$str_mb\" length(mb_strlen, UTF-8):".mb_strlen($str_mb, "UTF-8").$br; echo "\"$str_mb\" length(mb_strlen, EUC-JP):".mb_strlen($str_mb_euc, "EUC-JP").$br; echo "\"$str_mb\" length(mb_strlen, Shift_JIS):".mb_strlen($str_mb_sjis, "Shift_JIS").$br; |
ブラウザで確認した結果は、以下の通りです。デフォルトエンコーディングであるUTF-8は、ひらがな1文字を3バイトでカウントするため、「おはよう」は12バイトになります。
PHPでUTF-8以外の文字コードを扱う方法|文字コード変換の留意点も解説!文字列の連結
文字列を連結するには、主に以下の方法があります。
連結方法 | 方法 |
文字列を直接連結 | 連結演算子を利用する |
特定の文字をはさみながら文字列を連結 | implode関数を利用する |
各方法の記述例を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $br = "<br />"; $str1 = "Hello everyone!"; $str2 = "I'm Sato Taro."; $str3 = "Nice to meet you!"; // 連結演算子を使った文字列連結 echo $str1 . " " . $str2 . " " . $str3 . $br; // implode関数を使った文字列連結 echo implode(" ", array($str1, $str2, $str3)); |
ブラウザで確認した結果は、以下の通りです。
PHPで文字列を連結させる方法!カンマを使った方法も解説 【PHP】implode関数で配列要素を文字列によって連結する方法文字列の分割
文字列を分割するには、主に以下の方法があります。
分割方法 | 方法 |
区切り文字を指定して文字列を分割 | explode関数を利用する |
文字数を指定して文字列を連結 | str_split関数を利用する |
各関数の記述例を、以下に示します。explode関数は、文字列分割時に指定した区切り文字を含めないことに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $br = "<br />"; $str = "param1,param2,param3,param4"; // explode関数は、区切り文字を指定して分割 $str_split_1 = explode("," , $str); // str_split関数は、文字数を指定して分割 $str_split_2 = str_split($str, 7); echo "explode関数による文字列分割".$br; foreach($str_split_1 as $data) { echo $data.$br; } echo "str_split関数による文字列分割".$br; foreach($str_split_2 as $data) { echo $data.$br; } |
ブラウザで確認した結果は、以下の通りです。
PHPで文字列を分割するには?explode関数の基本とその使い方文字列の切り出し
文字列の中から特定の文字列のみを切り出すには、主に以下の方法があります。
対象の文字列 | 方法 |
英数字 | substr関数を利用する |
日本語(マルチバイト文字) | mb_substr関数を利用する |
各関数の使用例は、以下のサンプルコードの通りです。いずれの関数も、切り出す文字列の先頭位置と文字数を引数として指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $br = "<br />"; $str = "Hello everyone!"; $str_jp = "おはよう御座います"; // 英数字の文字列切り出し $sub_str_1 = substr($str, 6, 3); $sub_str_2 = mb_substr($str, 6, 3, "UTF-8"); // 日本語の文字列切り出し $sub_strjp_1 = substr($str_jp, 4, 5); $sub_strjp_2 = mb_substr($str_jp, 4, 5, "UTF-8"); echo $str.$br; echo "substr:".$sub_str_1.$br; echo "mb_substr:".$sub_str_2.$br; echo $br; echo $str_jp.$br; echo "substr:".$sub_strjp_1.$br; echo "mb_substr:".$sub_strjp_2.$br; |
ブラウザで確認すると、以下のように表示されます。日本語をsubstr関数で切り出そうとすると正常に動作しませんが、mb_substr関数では正常に動作していることが分かります。
文字列の検索
文字列の中から特定の文字列を検索するには、主に以下の方法がります。
検索結果 | 方法 |
検索する文字列が現れる最初の位置 | strpos関数を利用する |
一致判定(対象文字列が存在したか否か) | preg_match関数を利用する |
各関数の使用例は、以下の通りです。preg_match関数の第1引数は、検索文字列を両端からスラッシュ(/)で囲んでいます。このような表現を正規表現と言い、検索文字列とさまざまな記号を組み合わせることで、より高度な文字列検索処理を実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $br = "<br />"; // 検索対象文字列 $str = "Hello everyone!"; // 検索文字列 $search_str = "everyone"; // strpos関数は、検索文字列の開始位置を取得する $pos = strpos($str, $search_str); echo "検索対象文字列:".$str.", 検索文字列:".$search_str.$br; echo "strpos関数:"; echo "開始位置:".$pos.$br; // preg_match関数は、文字列がヒットするか否かを判定する $exist = preg_match("/".$search_str."/", $str); echo "preg_match関数:"; if ($exist) { echo "文字列がヒットしました".$br; } else { echo "ヒットしませんでした".$br; } |
ブラウザで確認した結果は、以下の通りです。
【PHP】文字列を正規表現で検索する関数の使い方を解説文字列の置換
文字列の中にある特定の文字列を別の文字列に置き換えるには、主に以下の方法がります。
置換方法 | 方法 |
置換前の文字列と置換後の文字列をそれぞれ指定 | str_replace関数を利用する |
正規表現を用いて指定 | preg_replace関数を利用する |
使用例は、以下の通りです。preg_match関数と同様に、preg_replace関数も正規表現を用いて置換処理を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php $br = "<br />"; $text = "JavaScript is programming language. I like JavaScript. Do you like JavaScript?"; $str_before = "JavaScript"; $str_after = "PHP"; // str_replace関数は、置換前と置換後の文字列を設定 $text_replace = str_replace($str_before, $str_after, $text); echo "str_replace関数".$br; echo "置換前:".$text.$br; echo "置換後:".$text_replace.$br; // preg_replace関数は、正規表現を用いて設定 $text_replace_preg = preg_replace("/".$str_before."/", $str_after, $text); echo "preg_replace関数".$br; echo "置換前:".$text.$br; echo "置換後:".$text_replace_preg.$br; |
ブラウザ確認結果は、以下の通りです。
PHPで文字列を置換する方法!str_replace・preg_replace・str_ireplace【初心者向け】まとめ
いかがでしたか?
今回は、
・文字列の操作方法とよく利用する関数
について解説しました。
文字列を取り扱う際には、シングルクオートとダブルクオートの違いを理解しつつ適切に使い分けることがポイントです。また、文字列に対する操作も多種多様で、一度にすべてを覚えることは簡単ではありません。したがって、簡単なプログラム作成を通して、地道に身に着けていくことが重要です。