substr()
関数の定義と使い方
substr()
関数は、
文字列の中から指定した位置から指定した長さ分の文字列を切り出して取得する関数です。
echo substr('Hello world!', 6, 5);
// 'Hello World!'という文字列の7文字目から5文字分を切り出して取得します
配列に対しては、array_slice()
関数を使用すると、指定した範囲の要素を切り出して新しい配列として返します。
substr()
関数の構文は次のとおりです。
構文
substr(string $string, int $start, ?int $length = null): string
引数
$string |
必須。切り出して取得したい元の文字列です。 |
---|---|
$start |
必須。切り出しを開始する位置です。0 から始まり、文字列の最初の文字は0 番目のインデックスです。負の値を使う場合は、文字列の末尾から逆にカウントします。たとえば、-1 は文字列の最後の文字を示し、-2 は末尾から2番目の文字を示します。 |
$length |
オプション。切り出して取得する文字列の長さです。 デフォルト値は null で、この場合は開始位置から文字列の末尾まで全ての文字を取得します。 |
戻り値
substr()
関数は、部分文字列を正常に取得した場合、その部分文字列を返します。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 | $length 引数にnull を明示的に指定できるようになり、この場合、以前は空文字列を返していましたが、現在は文字列の末尾まで部分文字列を返します。 |
8.0.0 | 関数が以前はfalse を返していた場合、現在は空文字列を返します。 |
使い方
substr()
関数の使い方を見ていきましょう。
基本的な使い方
$originalString = 'Hello, world!';
$start = 7; // 開始位置
$length = 5; // 切り出す長さ
$extractedString = substr($originalString, $start, $length);
if ($extractedString !== false && $extractedString !== '') {
echo '抽出された文字列: ' . $extractedString;
} else {
echo '文字列の抽出に失敗しました';
}
// 出力: '抽出された文字列: world'
このコードでは、元の文字列「Hello, world!」の7番目のインデックスから開始し、長さ5の文字列「world」を抽出して出力します。
$start
パラメータに負の値を使用する例:文字列を末尾から検索する方法
substr()
関数の$start
パラメータに負の値を指定すると、文字列の末尾から逆にカウントされます。たとえば、-1は文字列の最後の文字を示し、-2は末尾から2番目の文字を示します。
以下は、$start
パラメータに負の値を指定する例です。
$originalString = 'Hello, world!';
$startNegative = -6; // 末尾から6文字目から開始
$length = 5; // 抽出する長さ
$extractedString = substr($originalString, $startNegative, $length);
echo '抽出された文字列: ' . $extractedString;
// 出力: '抽出された文字列: world'
このコードでは、$startNegative
変数に-6
を割り当てています。これは文字列「Hello, world!」の末尾から6文字目から開始し、長さ5の文字列「world」を抽出することを意味します。
以下の例は、$start
パラメータに負の値を使用する追加のサンプルコードです。
// 最初の例
// "Hello world"という文字列の0番目のインデックスから開始し、-1番目のインデックスまでの部分文字列を返します。
// -1番目のインデックスは文字列の末尾を示すため、「Hello worl」を出力します。
echo substr('Hello world', 0, -1); // 0番目のインデックスから開始し、-1番目のインデックスまで出力
// => "Hello worl"
// 二番目の例
// "Hello world"という文字列の-9番目のインデックスから開始し、-3番目のインデックスまでの部分文字列を返します。
// -9番目のインデックスは文字列の0番目のインデックスより小さいため、文字列の末尾からインデックスを計算します。
// -3番目のインデックスは文字列の6番目のインデックスを示すため、「llo wo」を出力します。
echo substr('Hello world', -9, -3); // -9番目のインデックスから開始し、-3番目のインデックスまで出力
// => "llo wo"
// 三番目の例
// "Hello world"という文字列の0番目のインデックスから開始し、-4番目のインデックスまでの部分文字列を返します。
// -4番目のインデックスは文字列の3番目のインデックスを示すため、「Hello w」を出力します。
echo substr('Hello world', 0, -4); // 0番目のインデックスから開始し、-4番目のインデックスまで出力
// => "Hello w"
substr()
関数の$start
パラメータに負の値を指定することは、意外と混乱しやすいため、上記の例をよく参考にしてください。
substr()
関数の日本語のエンコーディング問題:mb_substr()
関数の使用
substr()
関数を使用する際に、日本語文字列のエンコーディング問題が発生することがあります。
これはUTF-8のようなマルチバイト文字エンコーディングを使用している場合に主に発生する問題です。
英語や数字などは1バイトですが、日本語や韓国語、中国語などは2バイト以上で表現されます。2バイト以上のバイトで表現されるものを「マルチバイト」と呼びます。
UTF-8のようなマルチバイト文字エンコーディングでは、1文字が複数バイトで表現されるため、単純にバイト数を使って文字列を切ると予期しない結果を招くことがあります。substr()
関数はバイト単位で文字列を切るため、マルチバイト文字の途中で切ると文字化けが発生する可能性があります。
substr()
関数の日本語エンコーディング問題
echo substr('はじめまして。ようこそ。', 7, 4);
この問題を解決するために、mb_substr()
関数を使用してマルチバイト文字列を正しく切り出すことができます。mb_substr()
関数はマルチバイト文字列をサポートしており、正確に文字単位で文字列を切り出すことが可能です。
次に、mb_substr()
関数を使用した例を示します。
echo mb_substr('はじめまして。ようこそ。', 7, 4);
上記のコードでは、mb_substr()
関数を使用して、マルチバイト文字列を正しく抽出しています。
そのため、日本語を含む文字列を扱う場合は、mb_substr()
関数を使用して文字列を正しく切り出すよう注意する必要があります。
ご注意ください!mb_substr()
関数は、substr()
関数をマルチバイト文字に対応させた、安全に動作する代替関数です。