UPDATE:2024年11月12日
PHP の文字列
1 Minute Note
- 文字列はPHPのデータ型 文字列型(string)
- 文字列は文字が連結したもの
- 文字列の指定は4種類
シングルクォート ' (シングルクォート=引用符) で指定
ダブルクォート " (ダブルクォート=二重引用符) で指定
ヒアドキュメント構文 "<<<"任意ID ~ 任意ID; で指定
Nowdoc構文 '<<<'任意ID ~ 任意ID; で指定 - ' (シングルクォート) のエスケープシーケンス
\' シングルクォート
\\ バックスラッシュ
- " (ダブルクォート)のエスケープシーケンス
\' シングルクォート
\" ダブルクォート
\n 改行
\r 復改
\t タブ
\\ バックスラッシュ
\$ ドル記号
\{ 左波括弧
\} 右波括弧
\[ 左角括弧
\] 右角括弧
\0から\777 8進数形式で表したASCII文字
\x0から\xFF 16進数形式で表したASCII文字
文字列とは
- 文字列はPHPのデータ型 文字列型(string)
- 文字列は文字が連結したもの
文字列はPHPが扱うデータ型の一つ 文字列型(string) であり、文字が連結されたものです。PHPにおいて文字列の最大長は2GB(2,147,483,647 byte)です。
//文字列 's' 'string'
文字列を指定する
- 文字列の指定は4種類
シングルクォート ' (シングルクォート=引用符) で指定
ダブルクォート " (ダブルクォート=二重引用符) で指定
ヒアドキュメント構文 "<<<" で指定
Nowdoc構文 '<<<' で指定
PHPでは文字列を指定する方法が4種類あります。文字列リテラル(文字列の値そのもの)を、「' (シングルクォート)」「" (ダブルクォート)」「<<< (ヒアドキュメント構文)」「'<<<'(Nowdoc構文)」を使用して指定します。リテラルとは値そのもののことで、文字列リテラルとは文字列の値そのもののことです。リテラルについての詳細はこちらを参照下さい。
「' (シングルクォート=引用符)」で文字列を指定
- 「' (シングルクォート=引用符)」は文字列指定の最も簡単な方法
- 「' (シングルクォート=引用符)」だと変数展開なし
- 「' (シングルクォート=引用符)」の場合、特殊文字のエスケープシーケンスはシングルクォートとバックスラッシュの2つ
「' (シングルクォート=引用符)」による文字列の指定
PHPでは文字を「' (シングルクォート=引用符)」で囲むと文字列として扱われます。これは最も簡単な文字列指定方法です。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php echo '文字列'; $string = '文字列'; if('abc' == 'efg') echo '同じ文字列です。'; else echo '異なる文字列です。'; ?> |
文字列型であるかどうか調べるには is_string() 関数を使用します。
1 2 3 4 5 | <!-- サンプルコード --> <?php $string = 'Hello World!'; if(is_string($string) === TRUE) echo '文字列型です。'; ?> |
結果は
となります。
シングルクォートの変数展開について
ダブルクォートで変数を囲むと変数が展開されて変数の中身が表示されますが、「' (シングルクォート=引用符)」の場合、変数は展開されません。
1 2 3 4 5 | <!-- サンプルコード --> <?php $var = '文字列です。'; echo '$var'; ?> |
結果は
となります。
シングルクォートのエスケープシーケンスについて
「' (シングルクォート=引用符)」では2つの特殊文字のエスケープシーケンスが使用可能です。エスケープシーケンスとは、通常の文字列では表せない特殊な文字を規定された文字の並びにより表したものです。この規定された文字の並びがエスケープシーケンスです。
記述(規定された文字の並び) | 意味 |
---|---|
\' | 引用符 |
\\ | バックスラッシュ |
これは特殊文字を「' (シングルクォート=引用符)」内でただの文字列として扱うことを意味します。1つは目の特殊文字は同じ「' (シングルクォート=引用符)」です。文字列を囲んでいるシングルクォート内でシングルクォートをただの文字として扱う場合は、シングルクォートの前に「\(バックスラッシュ)」を配置します。
1 2 3 4 | <!-- サンプルコード --> <?php echo 'シングルクォート「\'」です。'; ?> |
結果は
となります。
2つ目は「\(バックスラッシュ)」です。シングルクォート内で「\(バックスラッシュ)」をただの文字として扱う場合は、「\(バックスラッシュ)」の前に「\(バックスラッシュ)」を配置します。
1 2 3 4 | <!-- サンプルコード --> <?php echo 'バックスラッシュ「\\」です。'; ?> |
結果は
となります。
「"(ダブルクォート=二重引用符)」による文字列の指定
- ダブルクォートで囲むと文字列として扱われる
- ダブルクォートだと変数が展開される
- 多数の特殊文字をエスケープシーケンスがある
「"(ダブルクォート=二重引用符)」による文字列の指定
PHPでは、シングルクォートと同様に、ダブルクォートで文字を囲むと文字列として扱われます。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php echo "文字列"; $string = "文字列"; if("abc" == "efg") echo "同じ文字列です。"; else echo "異なる文字列です。"; ?> |
文字列型であるかどうか調べるには is_string() 関数を使用します。
1 2 3 4 5 | <!-- サンプルコード --> <?php $string = "Hello World!"; if(is_string($string) === TRUE) echo "文字列型です。"; ?> |
結果は
となります。
ダブルクォートの変数展開について
「"(ダブルクォート)」で変数を囲むと変数が展開されて変数の中身が表示されます。これを変数展開と言います。
1 2 3 4 5 | <!-- サンプルコード --> <?php $var = "文字列です。"; echo "$var"; ?> |
結果は
となります。
※シングルクォートだと変数は展開されません。
ダブルクォートのエスケープシーケンスについて
ダブルクォートではシングルクォートより多数の特殊文字のエスケープシーケンスが使用可能です。シングルクォートの部分で説明しましたが、エスケープシーケンスとは、通常の文字列では表せない特殊な文字を規定された文字の並びにより表したものです。この規定された文字の並びがエスケープシーケンスです。
記述(規定された文字の並び) | 意味 |
---|---|
\n | ラインフィード (LF またはアスキーの 0x0A (10)) |
\r | キャリッジリターン (CR またはアスキーの 0x0D (13)) |
\t | 水平タブ (HT またはアスキーの 0x09 (9)) |
\v | 垂直タブ (VT またはアスキーの 0x0B (11)) (PHP 5.2.5 以降) |
\e | エスケープ (ESC あるいはアスキーの 0x1B (27)) (PHP 5.4.0 以降) |
\f | フォームフィード (FF またはアスキーの 0x0C (12)) (PHP 5.2.5 以降) |
\\ | バックスラッシュ |
\$ | ドル記号 |
\" | 二重引用符 |
\[0-7]{1,3} | 正規表現にマッチする文字シーケンスは、8 進数表記の 1 文字です。 |
\x[0-9A-Fa-f]{1,2} | 正規表現にマッチする文字シーケンスは、16 進数表記の 1 文字です。 |
文字列を囲んでいるダブルクォート内でダブルクォートをただの文字として扱う場合は、ダブルクォートの前に「\(バックスラッシュ)」を配置します。
1 2 3 4 | <!-- サンプルコード --> <?php echo "ダブルクォート「\"」です。"; ?> |
結果は
となります。
ソースコード上で改行を入れる場合は、ダブルクォート内で「\(バックスラッシュ)」+「n」を配置します。ブラウザ上で改行させるためには br タグを使用しますが、これだけではソースコード上で改行はしません。
1 2 3 4 5 | <!-- サンプルコード --> <?php print "ブラウザ上でもソースコード上でも改行させます。<br>\n"; print "ブラウザ上でもソースコード上でも改行させます。<br>\n"; ?> |
結果は
ブラウザ上でもソースコード上でも改行させます。
となります。
この場合ソースコード上でも改行しています。
ヒアドキュメント構文 "<<<" 任意ID ~ 任意ID;
文字列を指定する方法としてヒアドキュメント構文 "<<<" が利用できます。これは、任意のIDを "<<<" の後に指定し、それに続けて文字列を配置した後で、同じIDで括りを閉じます。複数行の文字列を扱うのに便利です。シングルクォート、ダブルクォート、空白はそのまま出力されます。ヒアドキュメントはダブルクォートで括る必要はありませんが、ダブルクォートで括られた文字列と全く同じ動作をします。PHP5.3からヒアドキュメントの宣言をダブルクォートで括ることが可能になりました。"<<<"
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php $string = <<< EOT '文字列' "文字列" .文字列. 文字列 EOT; echo "$string"; ?> |
結果は
となります。
PHP5.3からヒアドキュメントの宣言をダブルクォートで括れる
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php $string = <<< "EOT" '文字列' "文字列" .文字列. 文字列 EOT; echo "$string"; ?> |
結果は
となります。
終端 ID がある行には、セミコロン(;)以外の文字を含んではいけません。これは、ID をインデントしてはならず、また、セミコロンの前に空白やタブを付けてはいけないということです。終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された改行である必要があります。
以下はエラーになります。
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php $string = <<< EOT 文字列 文字列 文字列 EOT; echo "$string"; ?> |
Nowdoc構文 '<<<'任意ID ~ 任意ID;
例:
1 2 3 4 5 6 7 8 9 10 11 | <!-- サンプルコード --> <?php $string = <<< 'EOT' '文字列' "文字列" .文字列. 文字列 EOT; echo "$string"; ?> |
結果は
となります。
変数展開はされません。
1 2 3 4 5 6 7 8 | <!-- サンプルコード --> <?php $var = 'apples'; $string = <<< 'EOD' I like "$var" !!<br>\n EOD; echo $string; ?> |
結果は
となります。
変数を「 { } (波括弧) 」で括る
文字列をダブルクォートで括る
1 2 3 4 5 | <!-- サンプルコード --> <?php $var = 'apples'; echo "I like \"{$var}\" !!<br>\n"; ?> |
結果は
となります。
ヒアドキュメント構文で指定する
1 2 3 4 5 6 7 8 | <!-- サンプルコード --> <?php $var = 'apples'; $string = <<< "EOD" I like "{$var}" !!<br>\n EOD; echo $string; ?> |
結果は
となります。
配列やオブジェクトのプロパティーを展開することも可能です。
echo
- echo は全ての値を出力する
- echo は1度に複数の値を出力できる
- 返り値はなし(printは常に1が返る)
echo は文字列など全ての値を出力します。echo は関数ではなく言語構造です。関数ではないので「()括弧」は必要ではありません。また、1度に複数の値を出力できます。
1 2 3 4 5 | <!-- サンプルコード --> <?php echo "出力内容"; echo '出力内容'; ?> |
複数の値を表示させる場合はカンマで区切ります。
1 2 3 4 | <!-- サンプルコード --> <?php echo "1","2","3"; ?> |
結果は
となります。
- print は全ての値を出力する
- print は返り値があり、常に1を返す
print は文字列など全ての値を出力します。print は関数ではなく言語構造です。関数ではないので「()括弧」は必要ではありません。print は返り値があり、常に1を返します。
1 2 3 4 5 | <!-- サンプルコード --> <?php print "出力内容"; print '出力内容'; ?> |
1度に1つの値を表示します。
1 2 3 4 | <!-- サンプルコード --> <?php print '文字列です。'; ?> |
結果は
となります。
sprintf
- フォーマットされた文字列を返す
テンプレートを用いてフォーマットされた文字列を返します。文字列の書式をフォーマットに基づいて整形します。
1 2 3 4 5 | <!-- サンプルコード --> <?php $str = sprintf('名前:%s 年齢:%d', '山田太郎',19); echo $str; ?> |
結果は
となります。
- % – パーセント文字。引数は不要です。
- b – 引数を整数として扱い、 2 進数として表現します。
- c – 引数を整数として扱い、その ASCII 値の文字として表現します。
- d – 引数を整数として扱い、 10 進数として表現します。
- e – 引数を科学記法として扱います (例 1.2e+2)。 精度の指定子は、PHP 5.2.1 以降では小数点以下の桁数を表します。 それより前のバージョンでは、有効数字の桁数 (ひとつ小さい値) を意味していました。
- E – %e と同じですが、 大文字を使います (例 1.2E+2)。
- u – 引数を整数として扱い、符号無しの 10 進数として表現します。
- f – 引数を double として扱い、 浮動小数点数として表現します。
- F – 引数を float として扱い、 浮動小数点数として表現します (ロケールに依存しません)。 PHP 4.3.10 および PHP 5.0.3 以降で使用可能です。
- g – %e および %f の短縮形。
- G – %E および %f の短縮形。
- o – 引数を整数として扱い、 8 進数として表現します。
- s – 引数を文字列として扱い、表現します。
- x – 引数を整数として扱い、16 進数として (小文字で)表現します。
- X – 引数を整数として扱い、16 進数として (大文字で)表現します。
print_r
- 変数の内容を見や易い形式で出力
- デバック時に便利
指定した変数の内容を見や易い形式で出力します。デバック時に便利です。デバックとはコードの誤り(「バグ」と呼ばれる)を発見し、修正することです。
1 2 3 4 5 | <!-- サンプルコード --> <?php $array = array('山田','鈴木','斎藤'); print_r($array); ?> |
結果は
となります。
以下のような関数を作っておけば確認が楽になります。
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php function PD($input){ echo '[PHP ruler="true" toolbar="true"]'; print_r($input); echo '<\/pre>'; } $array = array('山田','鈴木','斎藤'); PD($array); ?> |
結果は
(
[0] => 山田
[1] => 鈴木
[2] => 斎藤
)
となります。
var_dump
- 変数の内容を見や易い形式で出力
- デバック時に便利
指定した変数の内容を見や易い形式で出力します。デバック時に便利です。デバックとはコードの誤り(「バグ」と呼ばれる)を発見し、修正することです。var_dumpはあらゆるPHPの変数を人間が読みやすい形式にして表示します。
1 2 3 4 5 | <!-- サンプルコード --> <?php $array = array('山田','鈴木','斎藤'); var_dump($array); ?> |
結果は
となります。
文字列のエンコードとエスケープ
- エスケープとは出力先に合わせてデータを適切な形にすること
エスケープとは出力先に合わせてデータの内容を適切な形にすることです。例えば、httpクライアント(ブラウザ)への出力時、データベースへ送信時、URLへの出力時、など、PHPから別の場所にデータを送信する際には、そのデータを適切にエスケープ処理する必要がある。出力先で誤った解釈をさせるとアプリケーションに重大な脆弱性が発生する可能性があります。エスケープ処理することでこのような事態を未然に防ぐことが出来ます。
httpクライアント(ブラウザ)出力時のエスケープ
- httpクライアント(ブラウザ)出力時のエスケープには htmlentities()関数 を利用
httpクライアントへ送信するデータをエスケープする場合、PHPの関数 htmlentities() を使用しましょう。この関数でデータをエスケープすることで、htmlとして意味のある文字列が変換されて無効化されます。
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] ) //[ ]は省略可能
例
1 2 3 4 5 6 7 | <!-- サンプルコード --> <?php //文字列をエスケープ $escapeString = htmlentities($string, ENT_QUOTES, 'UTF-8'); //httpクライアントへ出力 echo $escapeString; ?> |
この関数を使用する場合、オプションの引数を2つ付けて、「引数様式」と「文字セット」を指定すると適切にエスケープできます。
引数様式は、ENT_QUOTES を指定してシングルクォートとダブルクォートも変換しましょう。文字セットは Content-Type に一致させましょう。
PHPでは、頻繁に出力する送信先の httpクライアント、データベース、URL などに対して、エスケープするための固有の関数が用意されており、htmlentities()関数はその1つです。
データベースエスケープ MySQLの場合
- MySQLデータベース出力時のエスケープには mysqli_real_escape_string()関数 を利用する
- mysql_real_escape_string() ※PHP 5.5.0 で非推奨
- mysql_query() ※PHP 5.5.0 で非推奨
データベースへデータを送信する際のエスケープは関数は mysqli_real_escape_string()です。
この関数は以下の文字について先頭にバックスラッシュを付加し、データベースで意味にある文字列を無効化します。
NUL (ASCII 0) \n \r \ ' " Control-Z
1 2 3 4 5 6 7 8 9 10 | <!-- サンプルコード --> <?php //エスケープ処理 //$linkはmysqli_connect()で取得したリソースデータ $escapeString= mysql_real_escape_string($link, $string); //クエリ文字列作成 $query = "SELECT id, name, age FROM users ORDER BY id where name = ".$escapeString; //データベースへ送信 mysqli_query($link, $query); ?> |
URLのエスケープ
- URL出力時のエスケープには urlencode()関数 を利用する
- URL出力時のエスケープには htmlentities()関数 を利用する
以下の例を考えて見ましょう。
例
1 2 3 4 5 | <!-- サンプルコード --> <?php $string = 'トライピーエイチピー'; echo '<a href="https://wepicks.net/index.php?var='.$string.'">URL</a>'; ?> |
この例では、 $string に対して2種類のエスケープを考慮する必要があります。$string は、URLのクエリ文字列であると同時にHTMLのデータでもあります。つまり、URLへ出力しブラウザのアドレス欄で使用され(URL出力)、HTMLとしてブラウザでも表示されます(HTTPクライアント出力)。
下記のエスケープ処理が必要になります。
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 //変数初期化 $string = ''; $url = ''; $link = ''; $html = ''; $string = 'トライピーエイチピー'; //URL用にエスケープ $url = urlencode($string); //リンク文字列作成 //これでURL出力されてもOK $link = "https://wepicks.net/index.php?var={$url}"; //httpクライアント用にエスケープ //これでhttpクライアント出力されてもOK $html = htmlentities($link, ENT_QUOTES, 'UTF-8'); //httpクライアントに出力=ブラウザに表示 //クリックされればURLに出力 echo '<a href="'.$html.'">URL</a>'; ?> |
これで、ブラウザに表示されてhttpクライアント出力されても、クリックされてURL出力されても大丈夫です。
その他の関数
metaタグの抽出 get_meta_tags()関数を使用します。
文字列を比較する
完全一致
- 文字列の比較は比較演算子「==」 と 「===」 を使用
- 「==」の場合はデータ型の変換が起こる
- 「===」の場合は型の比較も行い型変換は起きない
文字列が同一であるかどうかを比較する場合は、比較演算子「==」 と 「===」 を使用します。
「==」は、文字列以外のオペランド(演算の対象となる値や変数のことです。「被演算子」と訳されることもあります。)が渡されると、自動的に文字列に変換(キャスト:型変換)して比較します。つまり 10 と “10” は同一のものとして扱われます。
「===」は、データ型の比較も行います。従って、データ型の変換(キャスト:型変換)を行いません。2つのオペランドのデータ型が異なる場合は false と扱われます。
演算子における型変換の詳細はこちらを参照下さい。
アルファベット順で比較
- 比較演算子「<」、「<=」、「>」、「>=」は文字列に対しても使用できる
- アルファベット順で比較する
比較演算子「<」、「<=」、「>」、「>=」、これらの演算子は文字列に対して使用できます。文字列をアルファベット順で比較します。
比較演算子で文字列と数値を比較した場合、予測と異なる結果を返します。比較演算子の片方のオペランドが数値の場合は、もう一方のオペランドも数値にキャストされます。
2つの文字列を明示的に文字列として比較する場合は、strcmp()関数を使用しましょう。
演算子における型変換(キャスト)の詳細はこちらを参照下さい。
文字列の 出力 操作 比較 検索
文字列の出力 echo
文字列の出力 print
文字列の出力 printf()
文字列の出力 print_r()
文字列の一部を取得 substr()
文字列の一部を取得(マルチバイト編) mb_substr()
文字列から最初と最後の空白を削除 trim()
文字列や変数の結合 「.」 「.=」
文字列を置換 str_replace()
文字列の暗号化 crypt() md5() hash() sha1
文字列の比較 strcmp()
文字列の検索 strstr()
文字列の出現数を調べる substr_count()
文字列の大文字小文字を置換 strtoupper() strtolower()
文字列を分割して配列に変換 explode()
文字列の長さを調べる strlen
文字列の長さを調べる(マルチバイト) mb_strlen
文字列の全角半角の変換 mb_convert_kana()
文字列のHTMLタグを無効にする(HTMLエスケープ) htmlentities()
文字列の HTMLタグ PHPタグ を削除する strip_tags()
文字列をURLエンコードする urlencode()
URLエンコードされた文字列をデコードする urldecode()
文字列の改行コードを<br>に変換 nl2br()
文字列のSQL文中の特殊文字をエスケープ mysql_real_escape_string()
サンプルコード
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <!-- サンプルコード --> <h3>文字列の扱い シングルクォート '</h3> <?php echo 'エスケープシーケンスシングルクォート\'とバックスラッシュ\\'; ?> <h3>文字列の扱い ダブルクォート "</h3> <?php print "\" <br>";//ダブルクォート print "\n <br>";//改行 print "\r <br>";//復改 print "\t <br>";//タブ print "\\ <br>";//バックスラッシュ print "\$ <br>";//ドルマーク print "\{ <br>";//左波括弧 print "\} <br>";//右波括弧 print "\[ <br>";//左角括弧 print "\] <br>";//右角括弧 ?> <h3>文字列の扱い Unixシェル風のヒアドキュメント</h3> <?php $string = <<< End_Of_Quote '文字列' "文字列" .文字列. 文字列 End_Of_Quote; echo "$string"; ?> <h3>文字列の扱い 変数の波括弧{}</h3> <?php $n = '12'; echo "you are the {$n}th person"; ?> <h3>文字列の扱い echo</h3> <?php $str = '文字列です。'; echo '$str'; echo '<br>'; echo "$str"; echo '<br>'; echo $str; echo '<br>'; ?> <h3>文字列の扱い print</h3> <?php $str = '文字列です。'; print '$str'; echo '<br>'; print "$str"; echo '<br>'; print $str; echo '<br>'; ?> <h3>文字列の扱い sprintf</h3> <?php $str = sprintf('名前:%s 年齢:%d', '山田太郎',19); echo $str; ?> <h3>文字列の扱い print_r</h3> <?php $array = array('山田','鈴木','斎藤'); print_r($array); ?> <h3>文字列の扱い デバック関数</h3> <?php function PD($input){ echo '[PHP ruler="true" toolbar="true"]'; print_r($input); echo '<\/pre>'; } $array = array('山田','鈴木','斎藤'); PD($array); ?> <h3>文字列の扱い var_dump</h3> <?php $array = array('山田','鈴木','斎藤'); var_dump($array); ?> |
タグ(=記事関連ワード)
日付
最終更新日:2024年11月12日