日本語などのマルチバイト文字の扱いには注意が必要です。そのような文字のために「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
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";
この構文では、変数名の後には文字を続けられません。また連想配列は使用できません。
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
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'が返されます
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 ); // '��いう'
切り出す文字数が入力文字列の範囲を超えたとき、
が返されます。
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()は、文字列が現れる位置から末尾まで (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"
のように文字を並べます。これを省略した場合は既定の文字である、
が対象となります。
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() |
検索方向の違いは、マッチする文字が複数回出現する場合に顕在化します。
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'
一致するすべての文字列を置換し、置換後の文字列が返されます。
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
指定子 | 説明 | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
符号指定子 | 符号 (+、-) の使用を強制
|
|||||||||||||||||||||||||||||||||||||||
パディング指定子 | 文字で埋める
空白か |
|||||||||||||||||||||||||||||||||||||||
アラインメント指定子 | 左寄せ、または右寄せ
|
|||||||||||||||||||||||||||||||||||||||
表示幅指定子 | 結果の最低の桁数 | |||||||||||||||||||||||||||||||||||||||
精度指定子 |
浮動小数点数ではその桁数 文字列では文字数 |
|||||||||||||||||||||||||||||||||||||||
型指定子 | 型の指定
|
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
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
string utf8_decode ( string $data )PHP: utf8_decode - Manual
文字の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
拡張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
「-」「_」「.」と英数字以外の文字を、エスケープ、アンエスケープできます。
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
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
ハッシュ化によって、その文字列を代表する一意の文字列を取得できます。
string crypt( string $str // 対象の文字列 [, string $salt ] // ソルト文字列 )PHP: crypt - Manual
string md5( string $str // 対象の文字列 [, bool $raw_output = FALSE ] // TRUEならば、16バイト長のバイナリ形式となる )PHP: md5 - Manual
$raw_outputをTRUEとしない限り、32文字の16進数からなるハッシュ値が返されます。
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 ); // ○
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
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>'が挿入されます。