String
文字列

注意事項

毎回の授業の最初に出席メールを提出せよ.

前回の出席記録を確認せよ.出席メールを授業時間内に 送信したのに記載されていない学生はメールの自分宛のコピーを印刷し,宛先アドレス, 提出時間が間違っていないことを確認してから TA に申し出よ.

4 章 文字列

4.1 文字列定数のクォート処理

シングルクォート「'」
単純な文字列
ダブルクォート「"」
エスケープシーケンス,変数展開が必要なとき
ヒアドキュメント
複数にわたる文字列

ダブルクォート内では変数展開が行われる.p.80 サンプルコード 3 行目までのプログラム部分を p80.php というファイル名の完全な形の phpスクリプトに整えて実行せよ.(<?php と?> でコードを囲んでからHTML文書の外枠に挿入すればよい) 変数 $who と $where が展開されて出力されることを確認せよ. この例のように変数名の後が空白文字のときはこれでよいが, 文字が続くときはどこまでが変数名かを示すために括弧「{}」 を使う.p.80 8 行目のサンプルコードでは "{$n}th person" に含まれる変数 $n を展開して "12th person" として表示させたい. "$nth person"と書いてしまうと PHP は $nth という変数のことだと解釈してしまう.

変数名の展開は 1 回しか行われない.展開した後の文字列が変数名であってもこれ以上 展開されない.

シングルクォート内では変数展開が行われない.書いたままの文字列を出力したいときに使う. シングルクォート内で使えるエスケープシーケンスは「\'」,「\\」のみ.

例題1

画面に図 4-1. のように \' という 2 文字からなる文字列を表示させたい.

例 4-1. の実行結果
図 4-1. 例題 4-1. の実行結果

以下のスクリプトの $name = '  ' のシングルクォート内だけを書き換え, ex01.php として完成させよ,

例題 4-1.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
  <head>
    <title>ex01</title>
  </head>

  <body>
    <p>
<?php
$name = '    ';
echo $name;
?>
    </p>
  </body>
</html>

ダブルクォートで利用できるエスケープシーケンスの一覧は p.81 表 4-1.

複数行にまたがる文字列を使用する場合はヒアドキュメントが便利. 識別子は変数名と同様に自由に決められる.p.81 下の例では識別子が End_Of_Quote であり,「<<< End_Of_Quote」の次から「End_Of_Quote」の前までに 書いてあるものが文字列として扱われる. 「<<< End_Of_Quote」が開き括弧,「End_Of_Quote」 が閉じ括弧だと思えば良い.

改行や空白はそのまま扱われるがブラウザの表示は期待した通りでないかもしれない. 下の例 4 を sample04.php として作成し,表示を確認せよ. ソースを表示させてなぜ改行や複数の空白が表示されないのか考えよ.

例 4

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
  <head>
    <title>sample04</title>
  </head>

  <body>
    <p>
<?php
echo <<< End_Of_Quote
1 2  3   4    5
nextline
End_Of_Quote;
?>
    </p>
  </body>
</html>

4.2 文字列の表示

簡単に使いたいときは echo, 細かく書式を指定したいときは printf が向いている. デバッグ用には var_dump がよい. p.30の下の例4行の後,p.31 の上の例の6行目までのプログラムの php 文の最後に var_dump($person); と var_dump($creator); という行を追加して動作を確認せよ.複雑な内容の変数 $person と $creator に現在保存されているデータの 詳細を確認することができる.

4.3 個別の文字へのアクセス

p.87 の例参照.文字列変数に「{}」で位置を指定することで文字列の特定の場所の 一文字だけを指定することができる.

4.4 文字列のお掃除

特にウェブシステムとして利用する場合,後で処理しやすいように 入力データから余分なものを取り除く前処理を行う作業は重要である. よくあるのが余分な空白文字を取り除く,大文字,小文字を変換して 揃える,などの作業である.

空白文字を除去する trim, ltrim, rtrim の働きは p.88 の例参照.

大文字,小文字変換に使われる strtolower, strtoupper, ucfirst, ucwords は p.88 から p.89 の例参照.

4.5 エンコードとエスケープ

PHP では HTML 文書,URL, データベース言語を多く扱う. それぞれの記法には特別な意味を持つ文字がそれぞれ使われる. 例えば HTML 文書中では "<" を使うときは "&lt;" と書く必要がある. このように書き換えが必要な文字は多く,扱う言語によって規則は異なる. これはの書き換え処理専用の変換関数が用意されている.

関数 htmlentities は先述の "<" を "&lt;" に書き換えるような処理に用いる. htmlspecialchars も似た処理をする.ユーザの入力のうち "<" などの表示を乱す可能性の ある文字を書き換え,問題の無い形に書き換えるために使う.

下の例 5 を sample05.php として作成し,ブラウザでの表示を確認したのち ソースを表示させ, html の特殊記号が書き換えられている ことを確認せよ.また $a のかわりに htmlentities 関数を通す前の変数 $line を 出力するように変更し,表示結果とソースを確認せよ.どんな問題が生じているか理解せよ.

例 5

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
  <head>
    <title>sample05</title>
  </head>

  <body>
    <p>
<?php
$line ='0<h';
$a = htmlentities($line);
echo "$a";
?>
    </p>
  </body>
</html>

文字列の置換は変換テーブルと汎用の置換関数によって実装されている. get_html_translation_table で変換テーブルを取得することができるので, これを array_flip を使って逆変換テーブルを作り,汎用の置換関数である strtr にその逆変換テーブルを渡して逆変換を行うことができる.

ユーザの入力した文字列からタグを消去して文書だけをプレーンな形で取り出したいときに strip_tags を使う.

get_meta_tags によってメタタグの情報を取り込むことができる.

URL でも独特のエンコード処理が必要である.rawurlencode がエンコード関数, rawurldecode がデコード関数.

urlencode, urldecode と rawurlencode, rawurldecode の違いは空白の エンコードだけである.サーチエンジンへのクエリ文字列では空白を + で表すので そのためのエンコードである.p.93 中程の例は google に対して "PHP sessions -cookies" という検索ワードで検索するための URL をクエリ文字列エンコードを用いて作成し,出力するプログラムである.

SQL クエリ文字列でもエスケープが必要.これを行うのが addslashes, 逆変換が stripslashes である.

タブ記号を "\t" で表すなど,C 風のエンコードに使用するのが addsclashes である.

4.6 文字列の比較

== は自動型変換を行うが === は行わない.=== は型が違う場合は 無条件に等しくないと判定する.つまり (3 == "3") は真だが (3 === "3") は偽.

文字列間で < などの比較を行うと辞書式順序で比較される.

数値と文字列が混在する場合,文字列が数値に変換されて予期せぬ結果に なる可能性があるので比較演算子は用いるべきでない.明示的に文字列として 比較したい場合は strcmp(s1, s2) を使う.結果の判定は 「s1-s2」と 覚えると良い.この場合「小さい」とは辞書式順序で前にあることをいう.

大文字小文字の違いを無視して比較したい場合は strcasecmp を使う. strncmp で先頭から何文字めまでで比較するかを指定することができる.

strnatcmp と strnatcasecmp は「自然順」で比較を行う.自然順と ASCII 順の比較は p.96 表 4-5 を参照.

4.6.2 は省略

4.7 文字列の操作と検索

substr で文字列の一部取り出し,strrev で文字列を逆順にできる.

explode で例えばカンマ区切りの文字列を分解することができる.

explode が一気に分解して配列に格納するのに対して strtok は繰り返し呼んで使う. 呼ぶたびに次のトークンをスカラー変数に返す.メモリを節約したい場合に使う.

strstr ある文字が出現した位置以降を返す関数,strchr は何文字目まで 条件を満たしているかを数える関数.parse_url で URL に含まれている情報を 分解して利用することができる.

4.8 正規表現

ここでは POSIX, Perl 共通の事項について説明する.

文字クラス(角括弧[])内では "^","$","." の意味が変わることに注意せよ.

第 3 回課題「クエリ作成」 を提出せよ.


Updated in May 2, 2012, index.html, Yamamoto Hiroshi