PHPでウェブの世界と繋がろう!
menu
ホーム > PHPの文法 > 8 文字列 > 8-1 文字列の扱い

8-1 文字列の扱い

Pocket

- 1 分ノート ! -

  • 文字列はPHPのデータ型 文字列型(string)
  • 文字列は文字が連結したもの
  • 文字列の指定は4種類
    シングルクォート ' (シングルクォート=引用符) で指定
    ダブルクォート " (ダブルクォート=二重引用符) で指定
    ヒアドキュメント構文 "<<<"任意ID ~ 任意ID; で指定
    Nowdoc構文 '<<<'任意ID ~ 任意ID; で指定
  • ' (シングルクォート) のエスケープシーケンス
    \' シングルクォート
    \\ バックスラッシュ
  • " (ダブルクォート)のエスケープシーケンス
    \' シングルクォート
    \" ダブルクォート
    \n 改行
    \r 復改
    \t タブ
    \\ バックスラッシュ
    \$ ドル記号
    \{ 左波括弧
    \} 右波括弧
    \[ 左角括弧
    \] 右角括弧
    \0から\777 8進数形式で表したASCII文字
    \x0から\xFF 16進数形式で表したASCII文字

文字列とは
POINT
  • 文字列はPHPのデータ型 文字列型(string)
  • 文字列は文字が連結したもの

文字列はPHPが扱うデータ型の一つ 文字列型(string) であり、文字が連結されたものです。PHPにおいて文字列の最大長は2GBです。

//文字列
's'
'string'

文字列を指定する
POINT
  • 文字列の指定は4種類
    シングルクォート ' (シングルクォート=引用符) で指定
    ダブルクォート " (ダブルクォート=二重引用符) で指定
    ヒアドキュメント構文 "<<<" で指定
    Nowdoc構文 '<<<' で指定

PHPでは文字列を指定する方法が4種類あります。文字列リテラル(文字列の値そのもの)を、「' (シングルクォート)」「" (ダブルクォート)」「<<< (ヒアドキュメント構文)」「'<<<'(Nowdoc構文)」を使用して指定します。リテラルとは値そのもののことで、文字列リテラルとは文字列の値そのもののことです。リテラルについての詳細はこちらを参照下さい。

「' (シングルクォート=引用符)」で文字列を指定
POINT
  • 「' (シングルクォート=引用符)」は文字列指定の最も簡単な方法
  • 「' (シングルクォート=引用符)」だと変数展開なし
  • 「' (シングルクォート=引用符)」の場合、特殊文字のエスケープシーケンスはシングルクォートとバックスラッシュの2つ

「' (シングルクォート=引用符)」による文字列の指定

PHPでは文字を「' (シングルクォート=引用符)」で囲むと文字列として扱われます。これは最も簡単な文字列指定方法です。

echo '文字列';
$string = '文字列';
if('abc' == 'efg') echo '同じ文字列です。'; else echo '異なる文字列です。';

文字列型であるかどうか調べるには is_string() 関数を使用します。

$string = 'Hello World!';
if(is_string($string) === TRUE) echo '文字列型です。';

結果は

文字列型です。

となります。

シングルクォートの変数展開について

ダブルクォートで変数を囲むと変数が展開されて変数の中身が表示されますが、「' (シングルクォート=引用符)」の場合、変数は展開されません。

$var = '文字列です。';
echo '$var';

結果は

$var

となります。

シングルクォートのエスケープシーケンスについて

「' (シングルクォート=引用符)」では2つの特殊文字のエスケープシーケンスが使用可能です。エスケープシーケンスとは、通常の文字列では表せない特殊な文字を規定された文字の並びにより表したものです。この規定された文字の並びがエスケープシーケンスです。

「' (シングルクォート=引用符)」のエスケープシーケンス
記述(規定された文字の並び) 意味
\' 引用符
\\ バックスラッシュ

これは特殊文字を「' (シングルクォート=引用符)」内でただの文字列として扱うことを意味します。1つは目の特殊文字は同じ「' (シングルクォート=引用符)」です。文字列を囲んでいるシングルクォート内でシングルクォートをただの文字として扱う場合は、シングルクォートの前に「\(バックスラッシュ)」を配置します。

echo 'シングルクォート「\'」です。';

結果は

シングルクォート「'」です。

となります。

2つ目は「\(バックスラッシュ)」です。シングルクォート内で「\(バックスラッシュ)」をただの文字として扱う場合は、「\(バックスラッシュ)」の前に「\(バックスラッシュ)」を配置します。

echo 'バックスラッシュ「\\」です。';

結果は

バックスラッシュ「\」です。

となります。

「"(ダブルクォート=二重引用符)」による文字列の指定
POINT
  • ダブルクォートで囲むと文字列として扱われる
  • ダブルクォートだと変数が展開される
  • 多数の特殊文字をエスケープシーケンスがある

「"(ダブルクォート=二重引用符)」による文字列の指定
PHPでは、シングルクォートと同様に、ダブルクォートで文字を囲むと文字列として扱われます。

echo "文字列";
$string = "文字列";
if("abc" == "efg") echo "同じ文字列です。"; else echo "異なる文字列です。";

文字列型であるかどうか調べるには is_string() 関数を使用します。

$string = "Hello World!";
if(is_string($string) === TRUE) echo "文字列型です。";

結果は

文字列型です。

となります。

ダブルクォートの変数展開について

「"(ダブルクォート)」で変数を囲むと変数が展開されて変数の中身が表示されます。これを変数展開と言います。

$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 文字です。

文字列を囲んでいるダブルクォート内でダブルクォートをただの文字として扱う場合は、ダブルクォートの前に「\(バックスラッシュ)」を配置します。

echo "ダブルクォート「\"」です。";

結果は

ダブルクォート「"」です。

となります。

ソースコード上で改行を入れる場合は、ダブルクォート内で「\(バックスラッシュ)」+「n」を配置します。ブラウザ上で改行させるためには br タグを使用しますが、これだけではソースコード上で改行はしません。

print "ブラウザ上でもソースコード上でも改行させます。<br>\n";
print "ブラウザ上でもソースコード上でも改行させます。<br>\n";

結果は

ブラウザ上でもソースコード上でも改行させます。
ブラウザ上でもソースコード上でも改行させます。

となります。
この場合ソースコード上でも改行しています。

ヒアドキュメント構文 "<<<" 任意ID ~ 任意ID;

文字列を指定する方法としてヒアドキュメント構文 "<<<" が利用できます。これは、任意のIDを "<<<" の後に指定し、それに続けて文字列を配置した後で、同じIDで括りを閉じます。複数行の文字列を扱うのに便利です。シングルクォート、ダブルクォート、空白はそのまま出力されます。ヒアドキュメントはダブルクォートで括る必要はありませんが、ダブルクォートで括られた文字列と全く同じ動作をします。PHP5.3からヒアドキュメントの宣言をダブルクォートで括ることが可能になりました。"<<<"

$string = <<< EOT
'文字列'
"文字列"
.文字列.
 文字列
EOT;

echo "$string";
&#91;/PHP&#93;

結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>&apos;文字列&apos; &quot;文字列&quot; .文字列. 文字列 </strong>
</div>
となります。

PHP5.3からヒアドキュメントの宣言をダブルクォートで括れる
[PHP ruler="true" toolbar="true"]
$string = <<< "EOT"
'文字列'
"文字列"
.文字列.
 文字列
EOT;

echo "$string";
&#91;/PHP&#93;

結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>&apos;文字列&apos; &quot;文字列&quot; .文字列. 文字列 </strong>
</div>
となります。

<strong class="clrPp6">終端 ID がある行には、セミコロン(;)以外の文字を含んではいけません</strong>。これは、ID をインデントしてはならず、また、セミコロンの前に空白やタブを付けてはいけないということです。終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された改行である必要があります。

以下はエラーになります。
[PHP ruler="true" toolbar="true"]
$string = <<< EOT
		文字列
		文字列
		文字列
	EOT;

echo "$string";
&#91;/PHP&#93;

</div>






<a name="2-4"></a>
<h6>Nowdoc構文 &apos;&lt;&lt;&lt;&apos;任意ID ~ 任意ID;</h6>
<div id="txtBoxLms">
<strong class="clrPp6">Nowdoc構文</strong>は、ヒアドキュメント構文と似ていますが、ヒアドキュメントの場合、ダブルクォートで括られた文字列と全く同じ動作をするのに対して、Nowdocでは、<strong class="clrPp6">シングルクォートで括られた文字列と同じ動作をします</strong>。従って、<strong class="clrPp6">パース処理を行うことがなく変数展開などもありません</strong>。

<strong>例:</strong>
[PHP ruler="true" toolbar="true"]
$string = <<< 'EOT'
'文字列'
"文字列"
.文字列.
 文字列
EOT;

echo "$string";
&#91;/PHP&#93;

結果は
<div id="txtBoxLmnBgBrw1Br1">
<strong>&apos;文字列&apos; &quot;文字列&quot; .文字列. 文字列 </strong>
</div>
となります。

<strong>変数展開はされません。</strong>
[PHP ruler="true" toolbar="true"]
$var = 'apples';
$string = <<< 'EOD'
I like "$var" !!<br/>\n
EOD;
echo $string;

結果は

I like '$var' !!

となります。

変数を「 { } (波括弧) 」で括る
文字列をダブルクォートで括るかヒアドキュメント構文で指定すると、その中の変数は展開(パース)されます。複雑な文字列の場合、変数の範囲を明確にするのに変数を「 { }(波括弧) 」で括ります

文字列をダブルクォートで括る

$var = 'apples';
echo "I like \"{$var}\" !!<br/>\n";

結果は

I like 'apples' !!

となります。

ヒアドキュメント構文で指定する

$var = 'apples';
$string = <<< "EOD"
I like "{$var}" !!<br/>\n
EOD;
echo $string;

結果は

I like 'apples' !!

となります。

配列やオブジェクトのプロパティーを展開することも可能です。

echo
POINT
  • echo は全ての値を出力する
  • echo は1度に複数の値を出力できる
  • 返り値はなし(printは常に1が返る)

echo は文字列など全ての値を出力します。echo は関数ではなく言語構造です。関数ではないので「()括弧」は必要ではありません。また、1度に複数の値を出力できます。

echo "出力内容";
echo '出力内容';

複数の値を表示させる場合はカンマで区切ります。

echo "1","2","3";

結果は

123

となります。

print
POINT
  • print は全ての値を出力する
  • print は返り値があり、常に1を返す

print は文字列など全ての値を出力します。print は関数ではなく言語構造です。関数ではないので「()括弧」は必要ではありません。print は返り値があり、常に1を返します。

print "出力内容";
print '出力内容';

1度に1つの値を表示します。

print '文字列です。';

結果は

文字列です。

となります。

sprintf
POINT
  • フォーマットされた文字列を返す

テンプレートを用いてフォーマットされた文字列を返します。文字列の書式をフォーマットに基づいて整形します。

$str = sprintf('名前:%s 年齢:%d', '山田太郎',19);
echo $str;

結果は

名前:山田太郎 年齢:19

となります。

  • % – パーセント文字。引数は不要です。
  • 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
POINT
  • 変数の内容を見や易い形式で出力
  • デバック時に便利

指定した変数の内容を見や易い形式で出力します。デバック時に便利です。デバックとはコードの誤り(「バグ」と呼ばれる)を発見し、修正することです。

$array = array('山田','鈴木','斎藤');
print_r($array);

結果は

Array ( [0] => 山田 [1] => 鈴木 [2] => 斎藤 )

となります。

以下のような関数を作っておけば確認が楽になります。

function PD($input){
	echo '[PHP ruler="true" toolbar="true"]';
	print_r($input);
	echo '<\/pre>';
}
$array = array('山田','鈴木','斎藤');
PD($array);

結果は

Array
(
[0] => 山田
[1] => 鈴木
[2] => 斎藤
)

となります。

var_dump
POINT
  • 変数の内容を見や易い形式で出力
  • デバック時に便利

指定した変数の内容を見や易い形式で出力します。デバック時に便利です。デバックとはコードの誤り(「バグ」と呼ばれる)を発見し、修正することです。var_dumpはあらゆるPHPの変数を人間が読みやすい形式にして表示します。

$array = array('山田','鈴木','斎藤');
var_dump($array);

結果は

array(3) { [0]=> string(6) “山田” [1]=> string(6) “鈴木” [2]=> string(6) “斎藤” }

となります。

文字列のエンコードとエスケープ
POINT
  • エスケープとは出力先に合わせてデータを適切な形にすること

エスケープとは出力先に合わせてデータの内容を適切な形にすることです。例えば、httpクライアント(ブラウザ)への出力時データベースへ送信時URLへの出力時、など、PHPから別の場所にデータを送信する際には、そのデータを適切にエスケープ処理する必要がある。出力先で誤った解釈をさせるとアプリケーションに重大な脆弱性が発生する可能性があります。エスケープ処理することでこのような事態を未然に防ぐことが出来ます。

httpクライアント(ブラウザ)出力時のエスケープ
POINT
  • httpクライアント(ブラウザ)出力時のエスケープには htmlentities()関数 を利用

httpクライアントへ送信するデータをエスケープする場合、PHPの関数 htmlentities() を使用しましょう。この関数でデータをエスケープすることで、htmlとして意味のある文字列が変換されて無効化されます

string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
//[ ]は省略可能

//文字列をエスケープ
$escapeString = htmlentities($string, ENT_QUOTES, 'UTF-8');
//httpクライアントへ出力
echo $escapeString;

この関数を使用する場合、オプションの引数を2つ付けて、「引数様式」と「文字セット」を指定すると適切にエスケープできます。

引数様式は、ENT_QUOTES を指定してシングルクォートとダブルクォートも変換しましょう。文字セットは Content-Type に一致させましょう。

PHPでは、頻繁に出力する送信先の httpクライアント、データベース、URL などに対して、エスケープするための固有の関数が用意されており、htmlentities()関数はその1つです。

データベースエスケープ MySQLの場合
POINT
  • 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
//エスケープ処理
//$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のエスケープ
POINT
  • URL出力時のエスケープには urlencode()関数 を利用する
  • URL出力時のエスケープには htmlentities()関数 を利用する

以下の例を考えて見ましょう。

$string = 'トライピーエイチピー';
echo '<a href="http://www.tryphp.net/index.php?var='.$string.'">URL</a>';

この例では、 $string に対して2種類のエスケープを考慮する必要があります。$string は、URLのクエリ文字列であると同時にHTMLのデータでもあります。つまり、URLへ出力しブラウザのアドレス欄で使用され(URL出力)、HTMLとしてブラウザでも表示されます(HTTPクライアント出力)。

下記のエスケープ処理が必要になります。

//変数初期化
$string = '';
$url = '';
$link = '';
$html = '';

$string = 'トライピーエイチピー';

//URL用にエスケープ
$url = urlencode($string);

//リンク文字列作成
//これでURL出力されてもOK
$link = "http://www.tryphp.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出力されても大丈夫です。

その他の関数
PHPタグとHTMLタグの除去 strip_tags()関数を使用します。
metaタグの抽出 get_meta_tags()関数を使用します。

文字列を比較する

完全一致
POINT
  • 文字列の比較は比較演算子「==」 と 「===」 を使用
  • 「==」の場合はデータ型の変換が起こる
  • 「===」の場合は型の比較も行い型変換は起きない

文字列が同一であるかどうかを比較する場合は、比較演算子「==」 と 「===」 を使用します。
「==」は、文字列以外のオペランド(演算の対象となる値や変数のことです。「被演算子」と訳されることもあります。)が渡されると、自動的に文字列に変換(キャスト:型変換)して比較します。つまり 10 と “10” は同一のものとして扱われます。
「===」は、データ型の比較も行います。従って、データ型の変換(キャスト:型変換)を行いません。2つのオペランドのデータ型が異なる場合は false と扱われます。

演算子における型変換の詳細はこちらを参照下さい

アルファベット順で比較
POINT
  • 比較演算子「<」、「<=」、「>」、「>=」は文字列に対しても使用できる
  • アルファベット順で比較する

比較演算子「<」、「<=」、「>」、「>=」、これらの演算子は文字列に対して使用できます。文字列をアルファベット順で比較します。
比較演算子で文字列と数値を比較した場合、予測と異なる結果を返します。比較演算子の片方のオペランドが数値の場合は、もう一方のオペランドも数値にキャストされます。
2つの文字列を明示的に文字列として比較する場合は、strcmp()関数を使用しましょう。

演算子における型変換(キャスト)の詳細はこちらを参照下さい

文字列の 出力 操作 比較 検索

サンプルコード

– サンプル Click Here ! –

<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 '&#91;PHP ruler="true" toolbar="true"&#93;';
	print_r($input);
	echo '<\/pre>';
}
$array = array('山田','鈴木','斎藤');
PD($array);
?>

<h3>文字列の扱い var_dump</h3>
<?php
$array = array('山田','鈴木','斎藤');
var_dump($array);
?>

– サンプル Click Here ! –


タグ(=記事関連ワード)

タグ: ,

日付

投稿日:2011年12月21日
最終更新日:2014年02月05日

関連記事

配列関数サンプル

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/phpref-string/trackback/