文字列

日本語などのマルチバイト文字の扱いには注意が必要です。そのような文字のために「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を省略すると内部文字エンコーディングが使用されます。そのときそれが正しく設定されていないと予期せぬ結果を返すため、文字エンコーディングは明示すべきです。

文字エンコーディングを指定するときは文字数を省略できないため、文字列の最後まで取得するには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最初に現われる位置を見つけます。

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

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

echo ( strpos( 'abcde', 'ab' ) == 0 )? 'o' : 'x'; // o
echo ( strpos( 'abcde', 'z'  ) == 0 )? 'o' : 'x'; // o (先頭にマッチしたものと誤認している)

echo ( strpos( 'abcde', 'ab' ) === 0 )? 'o' : 'x'; // o
echo ( strpos( 'abcde', 'z'  ) === 0 )? 'o' : 'x'; // x

この関数は大文字/小文字を区別します。

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

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

類似の関数
  大文字/小文字の区別
あり なし
検索方向 前から strpos() stripos()
後から ※1 strrpos() strripos()
※1 後から検索した場合も、先頭から数えた位置が返されます。

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

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' );
echo bin2hex( $str ); // 82a0
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

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

echo similar_text ( "Hello", "Hello" , $percent); // 5
echo $percent; // 100

similar_text ( "Hello", "hello" , $percent);
echo $percent; // 80

similar_text ( "hello", "Hello" , $percent);
echo $percent; // 80

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>'が挿入されます。

PHPのマニュアルから検索