@ PHP

String functions:文字列関数

PHP が標準で提供する関数のことを組み込み(ビルトイン)関数と言います。

文字列関数は、文字列の加工や整形、部分文字列の検索 / 取得など、文字列の操作に関する機能を提供する組み込み関数です。
PHP: String 関数 – Manual

文字列の検証

検証は(validation)は、外部の発信源から来る入力が、期待通りのフォーマット、あるいは意味に従っているかを確認する処理です。

文字列の長さを調べる

trim() 関数は、文字列から前後の空白を取り除きます。文字列の長さを調べる strlen() と組み合わせて、サブミットされた値の、前置きと後置きのスペースを無視した文字列の長さを見つけ出すことができます。

string_07.php

<?php
if (isset($_POST['zipcode'])) {
    $zipcode = trim($_POST['zipcode']);
    $zip_length = strlen($zipcode);
    if ($zip_length != 7) {
        print '郵便番号は7桁で入力してください。';
    } else {
        print '郵便番号を登録しました。';
    }
} else {
    print <<<_HTML_
<form method="post" action="">
  郵便番号:<input type="text" name="zipcode">
  <br>
  <input type="submit" value="submit">
</form>
_HTML_;
}
?>

トリムした文字列の長さを簡潔にチェックする

trim() と strlen() の呼び出しを繋いでいっしょにしてもかまいません。

string_08.php

<?php
if (isset($_POST ['zipcode'])) {
    $_POST ['zipcode'] = preg_replace('/(s| )/','', $_POST ['zipcode'] );
    if (strlen ( trim ( $_POST ['zipcode'] ) ) != 7) {
        print '郵便番号は7桁で入力してください。';
    } elseif (!is_numeric($_POST ['zipcode'])) {
        print '郵便番号は7桁の数字で入力してください。';
    } else {
        print '郵便番号を送信しました。';
    }
} else {
    print <<<_HTML_
<form method="post" action="">
  郵便番号:<input type="text" name="zipcode">
   <br>
   <input type="submit" value="submit">
</form>
_HTML_;
}
?>

プログラムの流れはつぎのようになります。

  1. 変数 $_POST[‘zipcode’] の値が trim() 関数に渡されます。
  2. trim() 関数の戻り値(前後の空白が取り除かれて)が、strlen() 関数にわたされ、切り取られた文字の長さが返されます。
  3. 文字の長さが「7」であるかどうか比較されます。
  4. 長さが「7」に等しくなければ、if() ブロックの最初の print() 命令文が実行されます。

文字列中の全角スペースと半角スペースの置換、削除。

preg_replace() を使い、半角スペースと全角スペースを検索して”に置換し削除します。

$_POST ['zipcode'] = preg_replace('/(s| )/','', $_POST ['zipcode'] );

数値であるかどうかを調べる。

is_numeric() を使い $_POST [‘zipcode’] が数字または数値文字列であるかを調べます。

elseif (!is_numeric($_POST ['zipcode']))

文字列を等価演算子で比較する

2つの文字列を比較するには、等価演算子を使います。

string_09.php では、サブミットされたフォームパラメータの email が、すべて小文字の abe@gmail.com のときだけ実行されます。文字列を == で比較するときは、大文字か小文字が重要です。

string_09.php

<?php
if (isset($_POST['email'])) {
    if ($_POST['email'] == 'abe@gmail.com') {
        print 'こんにちは安部さん';
    }
} else {
    print <<<_HTML_
<form method="post" action="">
  Email: <input type="text" name="email">
  <br>
  <input type="submit" value="submit">
</form>
_HTML_;
}
?>

大文字、小文字の違いを意識しない文字列の比較

大文字、小文字に注意を払わないで文字列を比較するには、srtcasecmp() を使います。これは、大文字か小文字の違いを無視しながら、2つの文字列を比較します。

string_10.php

<?php
if (isset($_POST['email'])) {
    if (strcasecmp($_POST['email'], 'abe@gmail.com') == 0) {
        print 'こんにちは阿部さん';
    }
} else {
    print<<<_HTML_
<form method="post" action="">
  Email: <input type="text" name="email">
  <br>
  <input type="submit" value="submit">
</form>
_HTML_;
}
?>

テキストのフォーマット

printf()は引数をフォーマットしてから出力します。第1引数で指定したフォーマット文字列のフォーマット規則(修飾子で指定する)に第2引数(以降)で指定した値を当てはめて出力します。

printf() で価格をフォーマット

string_11.php では、フォーマット規則の $%.2f が $price*(1+$tax) の値で置き換えられ、少数点以下2桁の値になります。

文字列をフォーマットする規則は、% ではじまり、規則に影響するようなオプションの修飾子(.2のような)が続きます。

修飾子の後には、出力される値の種類を示す必須の文字を書きます。値の種類は、十進数の d、文字列の s、浮動少数点の f などです。

string_11.php

<?php
$price = 900; $tax = 0.08;
printf('この料理の金額は $%.2f',$price*(1+$tax));
?>
バインディング文字
置き換えようとしている文字列のフォーマット規則が短すぎる場合、この文字を詰めて使います。スペースで詰める時にはスペースを、ゼロで詰めるときは 0 を使います。
符号
printf() で数字のためのプラス記号(+)を使うと、正の数の前に + をつけます(通常は、符号なしで出力します)。また、文字列のためにマイナス記号(-)を使うと、右詰めします(通常は、左詰めします)。
最小値
フォーマット規則で値を置き換えるとき、最小となる大きさです。短すぎる場合は」、バインディング文字がその大きさを満たすために使われます。
ピリオドと小数点
浮動小数点のために、小数点以下を何桁にするかを制御します。

printf() で 0 詰めをする。

他にも printf() を使って手軽に表現できるものがあります。たとえば、最小幅のバインディング文字に「0」を使えば、ゼロからはじまる日付や郵便番号をフォーマットできます。

string_12.php

<?php
$zip = 1500091;
$month = 2;
$day = 6;
$year = 2014;
printf("郵便番号は%07d 日付は%02d/%02d/%d" ,$zip,$month,$day,$year);
?>

printf() で符号を表示

符号修飾子は正と負の値を明示的に示すための助けとなります。

strign13.php は、符号修飾子を使って温度を表示します。

string_13.php

<?php
$min = -40;
$max = 40;
printf("コンピュータは摂氏 %+d から %+d で操作することができます。",$min,$max);
?>

大文字、小文字の変更

strtolower() 関数はすべての文字を小文字に、strtoupper() 関数はすべての文字を大文字に変換します。

string_14.php

<?php
print strtolower('Beef,CHICKEN,Pork,duCK');
print '<br>';
print strtoupper('Beef,CHICKEN,Pork,duCK');
?>

ucwords() を使って名前などの文字列を整える

ucwords() 関数は文字列の中の単語の最初の文字を大文字にします。すべて大文字の名前から、上手にキャピタライズした名前を生成するためには、strtolower() と組み合わせて使います。

string_15.php

<?php
print ucwords(strtolower('ONE DIRECTION'));
?>

文字列の抽出

文字列から特定の文字列を抽出したり、置換することができます。

substr() で文字を切り取る

substr() 関数を使って、文字列の一部を取り出すことができます。ブログ記事の始めだけを表示したい場合があります。string_16.php では、サブミットされたパラメータからコメントを切り取り表示します。

string_16.php

<?php
if (isset($_POST['comment'])) {
    print substr($_POST['comment'], 0, 30);
    print '...';
} else {
    print <<<_HTML_
<form method="post" action="">
  コメント:<input type="text" size="50" name="comment">
  <br>
  <input type="submit" value="submit">
</form>
_HTML_;
}
?>

substr() の3つの引数は、「処理する文字列」、「抽出する文字列の開始点」、そして「抽出する文字数」です。

substr($_POST[‘comments’],0,30) は「$_POST[‘comennts’] の」文字列の先頭から 30 文字を抽出する」ことを意味します。

substr() で文字列の終わりを抽出する

substr() に負の開始点を与えた場合、文字列の最後から逆向きに文字列を数えて、開始点を決めます。-4 という開始点は「終わりから4文字目から始める」ことを意味します。

string_17.php では、クレジットカード番号の最後の4桁だけを表示するために負の開始点を使っています。

string_17.php

<?php
if (isset($_POST['card'])) {
    print 'Card: XX';
    print substr($_POST['card'],-4,4);
} else {
    print <<<_HTML_
<form method="post" action="">
  カードナンバー:<input type="text" size="20" name="card">
  <br>
  <input type="submit" value="submit">
</form>
_HTML_;
}
?>

str_replace() を使う

str_replace() 関数は、部分文字列を抽出する変わりに、文字列の一部を置き換えます。

string_18.php では、str_replace() を使って <span> タグの class 属性をセットします。

string_18.php

<?php
$my_class = 'lunch';
print str_replace('{class}',$my_class,
'<span class="{class}">うにといくらのクリームパスタ</span>
<span class="{class}">マッサマンカレー</span>');
?>