トップページ -> 勉強部屋 -> テキストの操作について

テキストの操作について

 PHPの多彩な文字列の表現歩方を学んできたところで、次にテキストをどのように操作することができるのか紹介します。

・文字列と文字列の結合便利な文字列操作関数

文字列と文字列の結合

 文字列同士の結合を行うには、ドット演算子「.」を利用します。ドット演算子を使えば、数値や数値が格納されている変数があったとしても、これらを文字列として結合を行います。
<?php
  // 単純な文字列の結合の例
  $str = "abc" . "def";
  echo $str . "\n";
	
  // 数値や変数を混ぜた例
  $price = 250;
  $str = "Price " . $price . " 円";
  echo $str . "\n";
	
  // 少し複雑な結合例
  $str = "abc"
     . "def"
     . "ghi";
  echo $str . "\n";	
出力結果
abcdef
Price 250 円
abcdefghi

便利な文字列操作関数

 関数とは、引数と呼ばれるデータを受け取り、一定の処理を実行して結果を返す命令のことです。ここでPHPでテキストを操作するのに便利な関数を紹介します。

■基本的な文字列操作関数
 ますは、長さを調べたり、一部を取り出したり、検索したりといった基本的な関数から消化します。ちなみに「substr()」などで関数の引数に角括弧がありますが、これは省略可能を意味する記号です。

基本的な文字列関数
trim($str)
  $strにある前後の空白を除去する

strlen($str)
  文字列の長さを調べてバイト数を返す

substr($str, $start [,$len])
  $strで$startから$lenバイトの文字列を返す。$lenを省略すると、$start以後の全ての文字列を返す。$startに負数を指定すると後ろから$lenバイト数を返す。

strpos($str, $kye [,$offset])
  $strの中で$kyeが何バイト目に出てくるかを調べて返す。$offsetは検索の開始位置を指定する。

 これらの基本的な関数を含め、ここで紹介する関数を使う上で注意しなくてはならないのは、文字数ではなくバイト数であるという部分です。PHP5以前では、多国語化が不十分のため、strlen()やsubstr()などの関数は、文字単位ではなく半角文字(つまりバイト)を単位として動作します。
 strlen()は、半角で数えた場合の文字数(すなわちバイト数)を返します。当然、日本語を考慮し文字数を返す命令も用意されています。
<?php
  // trim()の利用例
  $s = "  abc  ";
  echo trim($s)."\n\n";

  // strlen()の利用例
  $s = "1234567890";
  echo strlen($s)."\n\n";

  $s = "漢字";
  echo strlen($s)."\n\n";

  // substr()の利用
  $s = "1234567890";
  echo substr($s, 0, 5)."\n";
  echo substr($s, 3, 2)."\n";
  echo substr($s, 6)."\n";
  echo substr($s, -2, 2)."\n\n";

  // strpos()の利用例
  $s = "abcdefghijk";
  echo strpos($s, "c")."\n";
  echo strpos($s, "def")."\n\n";

  $i = strpos($s, "x");
  if( $i === false )
    echo "false\n";
  else
    echo $i."\n";
出力結果
abc

10

4から6(文字コードにより異なる)

12345
45
7890
90

2
3
false
 ここで特に注意したいのは、substr()やsubpos()でのバイト数の数え方です。一般的には、先頭の文字を1として数えますが、PHPでは0起点となります。例えば、文字列から一部を取り出すsubstr()で「substr($s,3,2)」と書いた場合、0から数えて3バイト目から2バイトを抜き出すと言う意味になります。また文字列を検索するstrpos()でも、「strpos("abc","c")」と書いた場合、0から数えて3バイト目、つまり2が検索結果となります。
 ところで、strpos()の注意点としては、一致する文字が見当たらない場合には、真偽値のfalseを返すという特性があります。そのため、戻り値を調べるとき、形まで一致するかどうか調べる「===」演算子を使って、falseかどうかを調べる必要があります。というのも、PHPでは、条件式で数値0をfalseと同等に見なすためです。つまり、文字列が先頭と一致した場合(戻り値が0の場合)に値としてはfalseと等しくなり、文字列が出現するにも関わらず、文字列が出現しないと判定されてしまいます。この点、ほかのプログラム言語と動作が異なるので注意しましょう。

■書式化を行うprintf()関数
 引数で与えられた文字列や数値を一定の書式に変換して出力するprintf()とsprintf()について紹介します。

printf()とsprintf()
printf($format, $args.....)
  特定の書式$formatに従って、引数$args.....を出力する

sprintf($format, $args.....)
  printf()と同じ書式を返すが、出力せず文字列を返す

 例えば、円周率を表示するときに、「%f」と書いた部分に数値を埋め込んで表示することができます。このとき「%.2f」と書くと少数以下2桁に四捨五入し。「%.4f」と書くと、小数点以下を4桁にします。
<?php
  $pi = 3.141592;
  printf("PI : %f", $pi);
  echo "\n";
  printf("PI : %.2f", $pi);
  echo "\n";
  printf("PI : %.4f", $pi);
  echo "\n";
出力結果
PI : 3.141592
PI : 3.14
PI : 3.1416
 よく使う書式には、以下のようなものがあります。利用例にもありますが、「%5s」や「%8s」のように書くと、文字列を指定のバイト数で右寄せして表示します。

よく使う書式
%s	文字列		printd("[%5s]","abc");
%d	整数		printd("[%5d]",321);
%f	実数		printd("[%.2f]",3.1415);
%x	16進数に変換	printd("[%x]",255);
<?php
  printf("[%5s]", "abc");
  echo "\n";
  printf("[%5d]", 123);
  echo "\n";
  printf("%03d", 8);
  echo "\n";
  printf("%.2f", 3.1415);
  echo "\n";
  printf("%x", 255);
  echo "\n";
出力結果
[  abc]
[  123]
008
3.14
ff