初心者による初心者のためのPHP講座 第3回 文字列

初心者による初心者のためのPHP講座 第3回 文字列※「\」が「\」に見える場合は、別のPCからアクセスする事をお勧めする。この記事では、意図して「\」を使用しており、「\」と「\」の区別が出来たほうが分かりやすい。

「文字列」とは、文字を集まり、つまりは文字で書かれた単語や文の事を指し、単語、文の長さに関係なく、PHPで文字列を扱う際は、それが文字列である事を表す構文を使う必要がある。

第2回 PHPの基本構造」でも、echo()関数の引数として文字列を用いている。

例えば「こんにちは」と表示させたい時は、echo()関数を用いて

<?php
echo "こんにちは";
?>

と命令文を書く必要がある。

「”こんにちは”」の部分が文字列であり、文字列を扱う場合は、文字列を「”」または「’」で囲む方法が良く用いられる。

このルールは、関数の引数として文字列を扱う場合だけでなく、変数に代入したり、条件式で用いる場合なども同様である。(変数と条件式は別の機会に説明する。)

引用符

「’」で文字列を囲む方法は、文字列の始まりと終わりを意味する「’」を文字列に直接書きこむ事が出来ない。

しかし、「’」の前に「\」または「\」を置き、「\’」または「\‘」とすることで、文字列内に「’」を書きこむことが出来る。

※バックスラッシュ「\」は、多くの日本語フォントでは「\」と表示されるが、同じ意味であり、日本語キボード上でも「\」と表示されているが、入力は「\」で良い。

また、「\」または「\」も同様に直接記述することが出来ず、「\」または「\」を記述する場合は、「\\」または「\\」とする必要がある。

文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>引用符を使った文字列</title>
</head>
<body>
<?php
echo '\'こんにちは\'<br />';
echo '\\こんにちは\\';
?>
</body>
</html>

上記のスクリプトの実行結果を表示

以上のような「\」または「\」を使った特殊な記述を「エスケープシーケンス」と言う。

エスケープシーケンスには、「\」または「\」を文字の前に置く以外に、特別なコードで置き換える方法もあり、構文やシステム都合のよる理由で、文字そのままでは不都合が生じる場合や文字で表現できない場合は、特別な文字や機能を特別なコードで置き換えたもの使用することがあり、これら全般をエスケープシーケンスと読んでいる。

ここで言うエスケープシーケンスは、狭義のものであるが、その他のエスケープシーケンスについては、別の機会に説明する。

また、特殊な文字や機能をエスケープシーケンスで置き換えることを「エスケープする」と言う。

なお、ここまでは、「\」と「\」の両方を表記してきたが、以後は「\」をもってエスケープシーケンスを意味し、エスケープされた文字を意味するものとする。

二重引用符

文字列は、「”」で囲む場合は、文字列内でも「’」の使用が許されるが「”」を使用する際は、「\”」とする必要がある。

また引用符「’」の場合と異なり、様々なエスケープシーケンスを文字列中に使用することが出来る。

  • \n ・・・ UNIX系の改行(LF)を意味する。
  • \r ・・・ 昔のMacなどの改行(CR)を意味するが、文字列中で改行させたい時は、通常は\nを使う。
  • \t ・・・ タブ(水平タブ)を意味でする。
  • \v ・・・ 垂直タブを意味する。PHP 5.2.5以降でサポート。
  • \f ・・・ フォームフィード(FF)。PHP 5.2.5以降でサポート。
  • \$ ・・・ ドル記号。
  • \\ ・・・ バックスラッシュ。

上記以外に(アスキー)文字の8進数表記を「\nnn」、16進数表記を「\xnn」と書くことも出来る。

※nは、8進数の場合は、0から7の数字で、16進数の場合は、数字の0から9およびアルファベットのaからf。

「\n」での改行は、タグの「<br />」を意味しておらず、あくまでHTMLソース上の改行であるため、ブラウザ上で反映されるわけではない、効果を確認するためにはブラウザでソースを見ること。

例えば、PHPでHTMLタグを含む文字列を表示させる場合、「\n」を使って改行を入れるとソースも見やすくなる。

「\r\n」は「CRLF」、つまりWindowsなどの改行コードとなる。

インターネットプロトコルでは、意外にもUNIX系の「LF」でなく、DEC系の「CRLF」が使われてきた経緯もあり、改行コードとして「CRLF」が必要なケースもあり得るので、使う機会があるかもしれない。

ともかく、改行コードの扱いはシステムによって事なる場合があり、意外に曲者なので、記憶しておくとトラブルの際の助けになるかもしれない。

私の経験では、ダウンロードしたPHPのメールフォームで送信されたメールが、メーラーのよっては正常に表示されず、メールフォーム自体もインターネットの決まりごと(RFC)を順守したものだったが、決まりを順守しない方向に改行コードを変更したら、問題が解消した経験がある。

エスケープシーケンス以外の特徴として、文字列内に変数を直接記述し、変数を使用することが許される。(文字列内で変数が展開される。)

変数の直後に文字が続く場合は、変数の終わりが判断できなくなるため、「{$text}」のように「{}」で囲むと良い。

ちなみに、関数を「{}」で囲むことで、文字列内に関数の戻り値を展開することも出来るのだが、本来、仕様にない事かもしれないので、使わない方が良いかもしれない。

文字列に空白、改行が含まれる場合は、空白と改行は、そのまま文字列に反映される。

以下のサンプルでは「変数」を使用しているが、変数については別の機会に説明する。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>二重引用符を使った文字列</title>
</head>
<body>
<?php
$text = "エスケープ";
echo "'\\こんにちは\\'<br />";
echo "こんにちは<br />\nさよなら<br />";
echo "\x41BC<br />";
echo "$text する<br />";
echo "{$text}sequence";
?>
</body>
</html>

上記のスクリプトの実行結果を表示

ヒアドキュメント構文

「”」や「’」で囲む代わりに文字列を「<<<ID」と「ID」で囲んでも良い。 これは、「ヒアドキュメント」と呼ばれる文字列を扱うための構文で、「ID」の部分は、任意の文字で置き換えることが出来る。 echo()関数と組み合わせて使うと下記のようになる。

<?php
echo <<<TEXT
こんにちは
"おはよう" と言う
TEXT;
?>

この構文は、複数行に渡る文字列を扱う場合に都合が良い。

ヒアドキュメント構文を使う際は、「<<<ID」直後で改行すること。

「ID」には、アルファベット、数字およびアンダースコアが使用できるが、最初の1文字は、アルファベットまたはアンダースコアでなければならない。

※PHP 5.3.0以降では、「<<<」の直後に来る「ID」のみ「”」で囲んで「”ID”」としても良い。

文字列の終わりを表す「ID」の前に空白やタブ、その他の文字を記述してはいけない。

加えて、文字列の終わりを表す「ID」の後ろに記述が許されるのは、命令文の終わりを表す「;」のみである。

ヒアドキュメント構文は、内部的には「”」で囲まれた文字列として処理されため、エースケープシーケンスや変数も使用できる。

しかし、文字列中に「”」を使用する場合もエスケープする必要はなく、直接、「”」と記述して良い。

文字列中に空白や改行を含む場合、空白はそのまま反映されるが改行は無視される。

Nowdoc構文

Nowdoc構文は、PHP 5.3.0以降でサポートされている。

この構文は、ヒアドキュメント構文と殆ど同じであるが、「<<<」の直後に来る「ID」を「’」で囲んで「<<<’ID’」とする必要がある。

<?php
echo <<<'TEXT'
こんにちは
'おはよう' と言う
TEXT;
?>

基本的なルールは、ヒアドキュメント構文と同じである。

ただし、Nowdoc構文は、内部的には「’」で囲まれた文字列として処理されため、変数は使えず、利用可能なエスケープシーケンスも文字列を「’」で囲む場合と同じである。

しかし、文字列中に「’」を使用する場合もエスケープする必要はなく、直接、「’」と記述して良い。

文字列中に空白や改行を含む場合、空白はそのまま反映されるが改行は無視される。

ヒアドキュメント構文、Nowdoc構文を使用したスクリプトの実行結果を表示

文字列の連結

「”」や「’」で囲まれた文字列を下記の要領で「.」を使って連結して、1つの文字列として扱うことが出来る。

'文字列1'.'文字列2'.'文字列3'
"文字列1"."文字列2"."文字列3"

下記のサンプルでは、echo()関数を使って連結した文字列をブラウザに表示させている。

<!doctype html>
<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>文字列の連結</title>
</head>
<body>
<?php
echo 'こんにちは '.'さよなら';
?>
</body>
</html>

上記のスクリプトの実行結果を表示



PHP, PHP講座, ネット・PCPermalink