文字列

日本語などのマルチバイト文字の扱いには注意が必要です。そのような文字のために「mb_」から始まる名称の関数が用意されている場合があるため、そちらの使用を検討すべきです。

文字列リテラル

文字列リテラルを指定する方法には、ヒアドキュメントもあります。

引用符 (')

基本的に記述したままの形式で出力されます。ただし、引用符はバックスラッシュでエスケープする必要があります。

echo '\''; // OK
echo ''';  // Parse error: syntax error, unexpected ''; '

二重引用符 (")

文字列中に記述された変数が、その文字列中に展開されます。また\nや\tなどのエスケープ シーケンスが評価されます。変数のパース - PHP: 文字列 - Manual

$a = 123;
echo '$a'; // $a
echo "$a"; // 123
echo '\x41'; // \x41
echo "\x41"; // A

簡単な構文 (Simple syntax)

echo "$foo";
echo "AA$foo AA";
echo "AA $fooAA";   // Notice: Undefined variable

echo "$arr[0]";
echo "$arr['key']"; // Parse error: syntax error

echo "$obj->bar";

この構文では、変数名の後には文字を続けられません。また連想配列は使用できません。

複雑な構文 (Complex syntax) または波かっこ構文 (curly syntax)

echo "{$foo}AA";
echo "${foo}AA"; // ${の形式も有効です

echo "{$arr['key']}";

echo "AAA {${Baz()}}";

多次元配列には複雑な構文を使用します。

$a = array( array( 1,2,3 ), array( 4,5,6 ) );

echo "$a[1][2]";   // Array[2] と出力
echo "{$a[1][2]}"; // 6 と出力

関数やクラスのメソッドも呼び出せます。ただし戻り値がそのまま出力されるわけではありません。

function A()
{
    return 'x';
}

$x = 123;
echo "{${A()}}"; // 123と出力

この例ではまずA()'x'を返すため、{A()}xとなり、"{${A()}}""{$x}"と解釈されます。そして$xの値である123が出力されます。

文字列の操作

結合

結合演算子 (.) を用います。PHP: 文字列演算子 - Manual

$b = '+';

$a = 'ABC'.$b;
$a .= 'DEF';

echo $a; // ABC+DEF

ちなみにechoで出力するのが目的ならば、文字列をカンマで区切ることでも結合されて出力されます。

$a = 'a';
$b = 'b';

echo $a, $b; // ab
echo $a.$b;  // ab

連結 (Join)

string implode(
    string $glue,   // 要素間にはさむ文字列
    array $pieces   // 連結する文字列の配列
    )
PHP: implode - Manual

配列の要素を、$glueで連結して文字列にします。

echo implode( 'AA', array( 1, 2, 3 ) ); // 1AA2AA3

連結文字列の$glueを省略できる形式もあり、この場合は空文字列で連結されます。

string implode( array $pieces)

文字列の分割

クエリ文字列の連結

連結するのがHTTPのクエリ文字列ならば、http_build_query()が便利です。

string http_build_query(
    mixed $query_data
    [, string $numeric_prefix
    [, string $arg_separator
    [, int $enc_type = PHP_QUERY_RFC1738
    ]]] )
PHP: http_build_query - Manual

結合されるとき、クエリはURLエンコード (パーセントエンコード) されます。

echo http_build_query( array( 1, 2, '@' ) );    // 0=1&1=2&2=%40
echo http_build_query( array( 1, 2, 3 ), 'A' ); // A0=1&A1=2&A2=3

echo http_build_query( array( 'a'=>1, 'b'=>2, 'c'=>3 ) ); // a=1&b=2&c=3

クエリの先頭に必要な「?」は付加されませんので、パスの文字列に連結するときにはそれを追加する必要があります。

同じ文字の連結

string str_repeat(
    string $input,
    int $multiplier
    )
PHP: str_repeat - Manual

同じ文字をくり返した文字列を生成できます。

str_repeat( 'ABC', 3 ); // 'ABCABCABC'が返されます

分割 (Split)

array explode(
    string $delimiter,    // 区切り文字列
    string $string        // 入力文字列
    [, int $limit = -1 ]  // 返される配列の要素数の制限
    )
PHP: explode - Manual

文字列stringを文字列delimiterで分割し、分割された文字列の配列を返します。

print_r( explode( 'A', '1A2A3a4' ) );
// Array ( [0] => 1 [1] => 2 [2] => 3a4 )

文字列の連結

結果を順に取り出す

string strtok(
    string $str,    //
    string $token   //
    )
PHP: strtok - Manual

文字列strを文字列tokenで分割し、分割された最初の文字列を返します。

string strtok(
    string $token   //
    )

分割された2つ目以降の文字列を返します。呼び出すごとに、結果を順に返します。

抽出

substr()は、文字列の一部を取り出します。

string substr(
    string $string,  // 入力文字列
    int $start       // 切り出し位置
    [, int $length ] // 文字数 (バイト単位)
    )
PHP: substr - Manual
substr( 'abcdef', 1 );     // 'bcdef'
substr( 'abcdef', 1, 3 );  // 'bcd'
substr( 'abcdef', 1, -2 ); // 'bcd'
substr( 'abcdef', 0, 4 );  // 'abcd'

substr( 'abcdef', -1  );   // 'f'
substr( 'abcdef', -3  );   // 'def'
substr( 'abcdef', -3, 1 ); // 'd'

substr( 'あいう', 1  );     // '��いう'

切り出す文字数が入力文字列の範囲を超えたとき、

  • 入力文字列の終端を超える … 入力文字列の末尾まで
  • 入力文字列の切り出し位置を超える … FALSE

が返されます。

substr( 'abcdef', 1, 5 );  // 'bcdef'
substr( 'abcdef', 1, 10 ); // 'bcdef'

substr( 'abcdef', 0, -5 );  // 'a'
substr( 'abcdef', 0, -10 ); // FALSE
substr( 'abcdef', 2, -5 );  // FALSE

より柔軟に文字列を取り出すには、正規表現のパターンマッチを使用します。

1文字だけを取り出すならば、配列のように角かっこで文字の位置を指定する方法もあります。

$a = 'abcd';
echo $a[ 2 ]; // cと出力される。

echo 'abcd'[ 0 ]; // a
echo 'abcd'[ 1 ]; // b
echo 'abcd'[ 2 ]; // c
パス文字列

パス文字列からパスに関する情報を取り出すならば、それ専用の関数が用意されています。

マルチバイト文字
string mb_substr (
    string $str ,       // 入力文字列
    int $start          // 切り出し位置
    [, int $length      // 切り出す最大文字数
    [, string $encoding // 文字エンコーディング
    ]] )
PHP: mb_substr - Manual

$encodingを省略すると内部文字エンコーディング (mbstring.internal_encoding) が使用されます。そのとき内部文字エンコーディングが正しく設定されていないと予期せぬ結果を返すため、文字エンコーディングは明示すべきです。

文字エンコーディングを指定するときは文字数を省略できないため、文字列の最後まで取得するにはmb_strlen($str)で得られる入力文字列の文字数を、切り出す最大文字数として与えます。

mb_substr( $str, 2 );    '�いうえお'
mb_substr( $str, 2, 2 ); '��'

mb_substr( $str, 2, mb_strlen($str), 'UTF-8' ); 'うえお'
mb_substr( $str, 2, 2, 'UTF-8' );               'うえ'

mb_substr( $str, -1, mb_strlen($str), 'UTF-8' ); 'お'

切り出し位置を文字列で指定 (strstr)

strstr()は、文字列が現れる位置から末尾まで (before_needle=trueのときは先頭まで) の文字列を返します。

string strstr (
    string $haystack ,  // 入力文字列
    mixed $needle       // 切り出し位置の基準となる文字列
    [, bool $before_needle = false ]
    )
PHP: strstr - Manual
strstr( 'abcde', 'c' );        // 'cde'が返される
strstr( 'abcde', 'cd' );       // 'cde'
strstr( 'abcde', 'cd', TRUE ); // 'ab'
strstr( 'abcde', 'x' );        // FALSE

両端の文字の除外

string trim(
    string $str                             // 入力文字列
    [, string $charlist = " \t\n\r\0\x0B" ] // 削除する文字のリスト
    )
PHP: trim - Manual

削除する文字のリストは、"abc\t"のように文字を並べます。これを省略した場合は既定の文字である、

  • " " (0x20) … 通常の空白
  • "\t" (0x09) … タブ
  • "\n" (0x0A) … リターン
  • "\r" (0x0D) … 改行
  • "\0" (0x00) … NULバイト
  • "\x0B" (0x0B) … 垂直タブ

が対象となります。

文字列の検索

int strpos(
    string $haystack,    // 検索対象の文字列
    mixed $needle        // 検索する文字列 または整数に変換される文字
    [, int $offset = 0 ] // 文字列内での検索開始位置
    )
PHP: strpos - Manual

$haystackから$needleが最初に現われる位置を見つけます。

見つからないときはFALSEが返されます。一方で先頭の文字とマッチした場合は0が返されるため、これらを区別するには厳密な比較で判定する必要があります。

echo strpos( 'abcde', 'cd' ); // 2
echo strpos( 'abcde', 'D' );  // FALSE

この関数は大文字/小文字を区別します。この区別が不要ならば、stripos()を使用します。また類似した機能を持つものとして、下表の関数があります。

類似の関数
  大文字/小文字の区別
あり なし
検索方向 前から strpos() stripos()
後から strrpos() strripos()

検索方向の違いは、マッチする文字が複数回出現する場合に顕在化します。

echo strpos( 'A*A*A', 'A' );  // 0 (最初に現れる文字にマッチする)
echo strrpos( 'A*A*A', 'A' ); // 4 (最後に現れる文字にマッチする)

複雑な条件で検索するならば正規表現のpreg_match()で、さらにそのときマッチ位置も知りたいならばフラグを指定します。

指定位置の文字列とのマッチ

substr()で位置を指定して文字列を切り出し、それと比較します。たとえば文字列の末尾が"ABC"となっているかどうかは、

if( substr( $str, -3 ) == 'ABC' )

のようにして判定できます。

マッチ回数

マッチした回数が返されます。

int substr_count(
    string $haystack,    //
    string $needle       //
    [, int $offset = 0   //
    [, int $length ] ]   //
    )
PHP: substr_count - Manual

文字の置換

一致するすべての文字を置換し、置換後の文字列が返されます。

string strtr(
    string $str,   // 置換対象の文字列
    string $from,  // 変換される文字列
    string $to     // 置き換える文字列
    )
PHP: strtr - Manual

これはstrtr()であり、strstr()はまた別の関数となります。

strtr( 'abcd', 'bc', 'xx' ); // 'axxd'
strtr( 'aa aa', 'a', 'x' );  // 'xx xx'

$from$toの文字列の長さが異なると、長い部分の文字が無視されます。一方で、次項のstr_replace()では無関係です。

strtr( 'abcd', 'bc', 'x' );  // 'axcd'
strtr( 'abcd', 'b', 'xx' );  // 'axcd'

文字が一致しないと、何も置換されず返されます。

strtr( 'abcd', 'z', 'x' );   // 'abcd'

複数の条件で置換するならば、次の配列形式が便利です。

string strtr (
    string $str,         // 置換対象の文字列
    array $replace_pairs // 置換パターンの組
    )

この形式では、次のように置換パターンを渡します。

strtr( 'abcd', array( 'b'=>'x', 'c'=>'y' ) ); // 'axyd'

文字列の置換 (str_replace)

一致するすべての文字列を置換し、置換後の文字列が返されます。

mixed str_replace(
    mixed $search,    // 変換される文字列、または文字列の配列
    mixed $replace,   // 置き換える文字列、または文字列の配列
    mixed $subject    // 置換対象の文字列、または文字列の配列
    [, int &$count ]  // 置換が行われた数
    )
PHP: str_replace - Manual
str_replace( 'b',  'x',  'abc abc' );  // 'axc axc'が返される
str_replace( 'B',  'x',  'abc abc' );  // 'abc abc'
str_replace( 'b',  'xx', 'abc' );      // 'axxc'
str_replace( 'ac', 'x',  'abc abc' );  // 'abc abc'

置換方法を配列で指定すると、複数の条件で置換できます。

str_replace( array('a','c'), 'x',            'abc abc' ); // 'xbx xbx'
str_replace( array('a','c'), array('x','y'), 'abc abc' ); // 'xby xby'

置換に複雑な条件を要求するならば、正規表現のpreg_replace()を使用します。

文字列の調査

バイト数

int strlen(
    string $string // 対象の文字列
    )
PHP: strlen - Manual
strlen( 'ABC' );   // 3が返される
strlen( 'あいう' ); // 9

文字数 (文字列の長さ)

int mb_strlen (
    string $str
    [, string $encoding ]
    )
PHP: mb_strlen - Manual

第2引数の$encodingを指定しないときには、内部文字エンコーディング (mbstring.internal_encoding) が使用されます。

mbstring.internal_encodingがnullで、PHP文書のエンコーディングがUTF-8のとき、結果は次のように返されます。

mb_strlen( 'ABC' );            // 3が返される
mb_strlen( 'あいう' );          // 9

mb_strlen( 'ABC', 'UTF-8' );   // 3
mb_strlen( 'あいう', 'UTF-8' ); // 3

文字列のフォーマット

string sprintf(
    string $format    //
    [, mixed $args    //
    [, mixed $... ] ] //
    )
PHP: sprintf - Manual
変換指定子 (conversion specifications)
指定子 説明
符号指定子 符号 (+、-) の使用を強制

+を指定すると、正数でも+符号がつく

パディング指定子 文字で埋める

空白か0を指定する

アラインメント指定子 左寄せ、または右寄せ

-を指定すると、左寄せとなる

表示幅指定子 結果の最低の桁数
精度指定子

浮動小数点数ではその桁数

文字列では文字数

型指定子 型の指定
記号 表示
% パーセント文字  
b 整数 バイナリ数値※1
c 整数 ASCII値の文字
d 整数 10進数
e 科学記法  
u 整数 符号なしの10進数
f double 浮動小数点数
F float 浮動小数点数
o 整数 8進数※1
s 文字列  
x 整数 16進数 (小文字) ※1
X 整数 16進数 (大文字)
※1 ただn進数の数値を出力するだけならば、専用の関数が用意されています。
sprintf( '%b', 100 );       // '1100100'を返す
sprintf( '%c', 100 );       // 'd'
sprintf( '%d', 100 );       // '100'

sprintf( '%5d', 123 );      // '  123'
sprintf( '%05d', 123 );     // '00123'

sprintf( '%.4f', 1.23456 ); // '1.2346'

sprintf( '%8.4f', 1.23 );   // '  1.2300'
sprintf( '%08.4f', 1.23 );  // '001.2300'

printf()ではなくsprintf()です。printf()は、フォーマットした文字列をそのまま出力します。PHP: printf - Manual

文字列の変換

数値への変換

+0とすることで、数値型に変換できます。

$foo = '10' + 0;
$foo = '10';
echo gettype( $foo ); // 'string'が返される

$foo = '10' + 0;
echo gettype( $foo ); // 'integer'

$foo = '10' + 0.0;
echo gettype( $foo ); // 'double'

文字列も数値に変換されます。文字列の数値への変換 - PHP: 文字列 - Manual

$foo = 'A' + 0;
echo gettype( $foo ); // 'integer'
echo 'A' + 0;        // 0
echo 'A1' + 0;       // 0
echo '1A' + 0;       // 1
echo 'A1A' + 0;      // 0
echo ' 1 ' + 0;      // 1
echo '10 20 30' + 0; // 10

整数への変換

int intval( mixed $var [, int $base = 10 ] )
PHP: intval - Manual

変換に成功した場合には変換された数値が、失敗した場合は0が返されます。なお'0'を変換した場合も0が返されるため、0が返されたとしても失敗とは判定できません。

echo intval( '10' ); // 10
echo intval( '0' );  // 0
echo intval( 'A' );  // 0
echo intval( 'A1' ); // 0
echo intval( '1A' ); // 1
全角数字

「0123…」のような全角の数字はintval()では数値と認識されないため、つねに変換に失敗し0が返されます。よってmb_convert_kana()で、先に半角文字に変換します。

$wNum = '1'; 全角の数字

intval( $wNum );                                  // 0が返される
intval( mb_convert_kana( $wNum, 'n', 'UTF-8' ) ); // 1

浮動小数点数への変換

float floatval( mixed $var )
PHP: floatval - Manual

エンコード / デコード

文字エンコーディング

string mb_convert_encoding (
    string $str ,
    string $to_encoding
    [, mixed $from_encoding ] )
PHP: mb_convert_encoding - Manual

mb_convert_encoding()の使用方法は、文字エンコーディングの変換で解説しています。たとえばSJISでの「あ」の文字コードは、 次のようにして確認できます。

$str = mb_convert_encoding( 'あ', 'SJIS', 'auto' );

for( $i = 0; $i < strlen( $str ); $i++ )
{
    echo '\x'.dechex( ord( $str[ $i ] ) );
}
// \x82\xa0 と出力される
UTF-8
utf8_encode()

ISO-8859-1 (Latin 1) 文字列を、UTF-8にエンコードできます。

string utf8_encode ( string $data )
PHP: utf8_encode - Manual
echo            utf8_encode( 'Œ' );   // Å
echo urlencode( utf8_encode( 'Œ' ) ); // %C3%85%C2%92
utf8_decode()
string utf8_decode ( string $data )
PHP: utf8_decode - Manual
ASCIIコード
ord()

文字のASCIIコードを取得できます。引数で文字列を渡した場合には、先頭文字のコードが返されます。

int ord ( string $string )
PHP: ord - Manual
echo ord( 'A' );  // 65
echo ord( 'AB' ); // 65

echo dechex( ord( 'A' ) ); // 41 (16進数)

このとき文書のエンコードがUTF-8ならば次のようになり、

echo dechex( ord( 'あ' ) );    // e3
echo dechex( ord( 'あ'[1] ) ); // 81
echo dechex( ord( 'あ'[2] ) ); // 82

Shift-JISならば、次のように結果が返されます。

echo dechex( ord( 'あ' ) );    // 82
echo dechex( ord( 'あ'[1] ) ); // a0
chr()

拡張ASCIIコードに対応した文字を取得できます。

string chr ( int $ascii )
PHP: chr - Manual

0~255の範囲を外れた場合には、下位8ビットの値のみが用いられます。

echo chr( 65 ); // A
echo chr( 66 ); // B

echo chr( 65 + 256 );         // A
echo chr( 65 + 256 * 2 );     // A
echo chr( 65 + 256 * 2 + 1 ); // B

URL

「-」「_」「.」と英数字以外の文字を、エスケープ、アンエスケープできます。

string urlencode ( string $str )
PHP: urlencode - Manual
string urldecode ( string $str )
PHP: urldecode - Manual

これと似た関数にrawurlencode()とrawurldecode()がありますが、これらは空白と+記号の扱いが異なります。php - urlencode vs rawurlencode? - Stack Overflow

echo urlencode   ( 'A B' ); // A+B
echo rawurlencode( 'A B' ); // A%20B

この空白を「+」に置き換える仕様は、application/x-www-form-urlencodedに従う形式です。

echo urldecode   ( 'A+B' ); // A B
echo rawurldecode( 'A+B' ); // A+B

ところでJavaScriptのエンコード関数にも対象文字の違いで2種類ありますが、PHPとは対象の文字が異なります。

echo urlencode   ( ';,/?:@&=+$#' ); // %3B%2C%2F%3F%3A%40%26%3D%2B%24%23
echo rawurlencode( ';,/?:@&=+$#' ); // %3B%2C%2F%3F%3A%40%26%3D%2B%24%23
base64
string base64_encode ( string $data )
PHP: base64_encode - Manual
echo base64_encode( 'This is an encoded string' ); // VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==
echo base64_encode( 'あ' );                        // 44GC
string base64_decode ( string $data [, bool $strict = false ] )
PHP: base64_decode - Manual

これらの関数はbase64urlとは異なりURLに含めることができない「+」「/」「=」をエンコードしないため、URLに利用するならば別途エンコードが必要です。5. Base 64 Encoding with URL and Filename Safe Alphabet - RFC 4648 - The Base16, Base32, and Base64 Data Encodings

半角と全角の変換

string mb_convert_kana(
    string $str              // 変換される文字列
    [, string $option        // 変換オプション
    [, string $encoding ] ]  // 文字エンコーディング
    )
PHP: mb_convert_kana - Manual

どのように変換するかは下表の変換オプションで指定します。これらは複数を組み合わせて指定できます。

変換オプション
オプション※1 意味
r / R 英字
n / N 数字
a / A 英数字 (U+0022、U+0027、U+005C、U+007Eを除く U+0021~U+007Eの範囲)
s / S スペース
k / K カタカナ
h / H 「全角ひらがな」と「半角カタカナ」
c / C 「全角カタカナ」と「全角ひらがな」
V 濁点付きの文字を一文字に変換する ([K]、[H]とともに使用する)

※1 小文字は「半角」、大文字は「全角」への変換を意味します。

echo mb_convert_kana( 'a', 'R' );  // a
echo mb_convert_kana( '1', 'N' );  // 1
echo mb_convert_kana( '1a', 'R' ); // 1a

ハッシュ化

ハッシュ化によって、その文字列を代表する一意の文字列を取得できます。

crypt

string crypt(
    string $str        // 対象の文字列
    [, string $salt ]  // ソルト文字列
    )
PHP: crypt - Manual

md5

string md5(
    string $str                    // 対象の文字列
    [, bool $raw_output = false ]  // TRUEならば、16バイト長のバイナリ形式となる
    )
PHP: md5 - Manual

$raw_outputをTRUEとしない限り、32文字の16進数からなるハッシュ値が返されます。

MD5ハッシュ値 計算ツール

文字列の形式の確認

mixed filter_var(
    mixed $variable
    [, int $filter = FILTER_DEFAULT
    [, mixed $options
    ]] )
PHP: filter_var - Manual

$variable$filterでフィルタリングした結果が返されます。$filterの形式に合致せず、処理に失敗した場合にはFALSEが返されます。

フィルタ

既定のフィルタはひどく簡易なため、実用には独自のコールバックで処理すべきです。

FILTER_VALIDATE_EMAIL。Eメールの形式であるか検証できます。PHP: 検証フィルタ - Manual

filter_var( 'abc', FILTER_VALIDATE_EMAIL );         // ×
filter_var( '@gmail.com', FILTER_VALIDATE_EMAIL );  // ×
filter_var( 'a@gmail.com', FILTER_VALIDATE_EMAIL ); // ○
filter_var( 'a@g.c', FILTER_VALIDATE_EMAIL );       // ○
filter_var( '&@1.a123', FILTER_VALIDATE_EMAIL );    // ○

FILTER_VALIDATE_URL。URLがRFC 2396に準拠しているか検証できます。

filter_var( 'abc', FILTER_VALIDATE_URL );                // ×
filter_var( 'http://example.com', FILTER_VALIDATE_URL ); // ○
filter_var( 'a://a', FILTER_VALIDATE_URL );              // ○
filter_var( '1://&', FILTER_VALIDATE_URL );              // ○

PHP: 検証フィルタ - Manual

文字列の類似性の評価

int similar_text (
    string $first ,
    string $second
    [, float &$percent ]
    )
PHP: similar_text - Manual

バイト単位で比較するため、マルチバイト文字は正しく判定できません。

N-gram

HTMLタグの操作

string strip_tags(
    string $str
    [, string $allowable_tags ]
    )
PHP: strip_tags - Manual

$allowable_tags以外の、HTMLとPHPタグそれにNULLを削除した文字列を返します。

string nl2br(
    string $string
    [, bool $is_xhtml = true ]
    )
PHP: nl2br - Manual

すべての改行文字 (\r\n、\n\r、\n、\r) の前に、'<br />'の文字列を挿入します。ただし$is_xhtmlをfalseとした場合には、'<br>'が挿入されます。