本記事の内容
本記事では、String関数、マルチバイト文字列関数である、
- explode (文字列を指定した文字列により分割する)
- substr (文字列の一部分を返す)
- nl2br (改行文字の前に HTML の改行タグを挿入する)
- str_replace (検索文字列に一致したすべての文字列を置換する)
- strpos (文字列内の部分文字列が最初に現れる場所を見つける, 文字列が存在するかの確認)
- htmlspecialchars (特殊文字を HTML エンティティに変換する) の使い方をざっくりまとめています。 さらに詳しく知りたいという方は、記事最後に公式ドキュメントのページを一覧で記載しています。 (順次追加です)
一つの関数あたり、
- 関数の詳細(公式リファレンスに沿った具体的なもの)
- ざっくりした説明
の二部構成です。
使い方に関しては、ざっくりした説明だけを見ていただければ理解できる程の情報量を簡潔にまとめています。
(誤解を招く表現等ありましたらコメントでお願いします)
explode関数
区切り文字列 入力文字列 limit に正の値が指定された場合、返される配列には 最大 limit の要素が含まれ、その最後の要素には string の残りの部分が全て含まれます。 ※基本的に使用する場合limitの指定は必要ではありません 区切り文字を「,」に指定したため、文字列の「,」の部分で三分割されています。explode関数
explode
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
文字列を区切り文字によって分割し、配列として保存する
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
separator
string
limit
もし limit パラメータが負の場合、 最後の -limit 個の要素を除く全ての構成要素が返されます。
limit パラメータがゼロの場合は、1 を指定したものとみなされます。
explode 使い方
$data = "apple,banana,orange";
$output = explode(',', $data);
// 出力用
var_dump($output);
array(3) {
[0]=>
string(5) "apple"
[1]=>
string(6) "banana"
[2]=>
string(6) "orange"
}
非常に便利な関数です。
substr関数
入力文字列。 offset が正の場合、返される文字列は、 string の 0 から数えて offset番目から始まる文字列となります。 例えば、文字列'abcdef'において位置 0にある文字は、'a'であり、 位置2には'c'があります。 例1 負の offset の使用 length が指定され、かつ正である場合、 返される文字列は offset (string の長さに依存します) から数えてlength文字数分となります。 ここで注目してほしいところが、「バイト」単位であることです。 「バイト」ではなく「文字」で設定が可能です。 マルチバイトを扱う場合は、mb_substrを使用する
substr関数
substr
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
文字列の一部分を切り取る
substr(string $string, int $offset, ?int $length = null): string
string
offset
offset が負の場合、返される文字列は、 stringの後ろから数えて offset番目から始まる文字列となります。
string の長さが offset 文字より短い場合は false が返されます。$rest = substr("abcdef", -1); // "f" を返す
$rest = substr("abcdef", -2); // "ef" を返す
$rest = substr("abcdef", -3, 1); // "d" を返す
length
length が指定され、かつ負である場合、 string の終端からその文字数分の文字が省略されます (offset が負の場合は、 開始位置を算出したあとで)。 もし offset が切り出し位置を超える場合、 false が返されます。
length が指定され、かつ 0、null、もしくは false であれば、空の文字が返されます。
length を省略した場合は、 offset の位置から文字列の最後までの部分文字列を返します。
substr 使い方
$data = "aiueo";
// 1番目から1バイト抜き取る
$output = substr($data,0,1);
// 出力用
var_dump($output);
// 出力
string(1) "a"
その為、日本語などマルチバイト文字では適切に処理ができません。
マルチバイト文字を少しでも使う可能性がある場合、mb_substr関数を使用してください。$data = "あいうえお";
// 2番目から1文字抜き取る
$output = mb_substr($data,1,1);
// 出力用
var_dump($output);
string(3) "い"
また、二番目の引数は、0から数え始めます。例えば10文字目であれば9となります。
nl2br関数
入力文字列。 XHTML 準拠の改行を使うか否か。 改行コードをそのままHTMLに変換する時に便利です。 とすることで、<br />ではなく、<br>と出力することができます。nl2br関数
nl2br
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
改行文字の前に HTML の改行タグを挿入する
nl2br(string $string, bool $use_xhtml = true): string
string
use_xhtml
(デフォルト:true)
nl2br 使い方
$data = "aiueo\nkakikukeko";
// \nの前に<br />を挿入
$output = nl2br($data);
// 出力用
var_dump($output);
string(22) "aiueo<br />\nkakikukeko"
また、$output = nl2br($data,false);
str_replace関数
探したい値。needle (針) と呼ばれることもあります。 配列を使えば、複数の値を指定することもできます。 見つかった search を置き換える値。 配列を使えば、複数の値を指定することもできます。 検索・置換の対象となる文字列あるいは配列。 haystack (干し草の山) と呼ばれることもあります。 subject が配列の場合、 subject の各エントリについて検索と置換が行われ、 返り値は同様に配列となります。 指定した場合は、マッチして置換が行われた箇所の個数がここに格納されます。 一つを置き換える場合に使用します。 str_replaceは配列で指定することで、複数を同時に置き換えることも可能です。 配列の順番通りに置き換えてくれます。 また、何個置き換えたのかを知りたいときは、 と四番目の引数に新しい変数名を指定することで、この例の場合は$countにint型で挿入してくれます。str_replace関数
str_replace
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
検索文字列に一致したすべての文字列を置換する
str_replace(
array|string $search,
array|string $replace,
string|array $subject,
int &$count = null
): string|array
search
replace
subject
count
str_replace 使い方
文字列バージョン
$data = "aiueokakikukeko";
// kaをsaに置き換える
$output = str_replace('ka','sa',$data);
// 出力用
var_dump($output);
string(15) "aiueosakikukeko"
配列バージョン
$data = "aiueokakikukeko";
// kaをsaに、kiをsiに置き換える
$output = str_replace(['ka','ki'],['sa','si'],$data);
// 出力用
var_dump($output);
string(15) "aiueosasikukeko"
$output = str_replace(['ka','ki'],['sa','si'],$data,$count);
例えば先ほどの例であれば1、何も置き換えをしなければ0となります。
strpos関数
検索を行う文字列。 PHP 8.0.0 より前のバージョンでは、needle が文字列でない場合、 数値に変換され、文字の通常の値として扱われていました。 この振る舞いは PHP 7.3.0 以降では推奨されないので、 この機能を使用しないことを強く推奨します。 意図した動作に依存する場合、 needle を string に明示的にキャストするか、 明示的に chr() 関数を呼び出すべきでしょう。 指定すると、文字列内での検索開始位置がその位置になります。 負の数を指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します。 strposでは検索のほかに、文字列が存在するかの確認に利用できます。 これは、検索する文字列が存在しない場合にstrposがfalseを返却することを利用して判断しています。 strposの標準の使い方です。 ちなみにカウントの開始位置が0から始まる為、この結果では14番目(13+1)にkoが最初に出現したことが分かります。 0からカウントされることに注意
strpos関数
strpos
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
文字列内の部分文字列が最初に現れる場所を見つける
strpos(string $haystack, string $needle, int $offset = 0): int|false
haystack
needle
offset
strpos 使い方
文字列が存在するかの確認
$data = "aiueokakikukeko";
// $dataにkoが存在するかを確認する
if(strpos($data,('ko'))!==false){
$output="存在します";
}else{
$output="存在しません";
}
// 出力用
var_dump($output);
string(15) "存在します"
文字列を検索する場合
$data = "aiueokakikukeko";
// $dataにkoがどこに存在するかを確認する
$output = strpos($data,'ko');
// 出力用
var_dump($output);
int(13)
htmlspecialchars関数
変換される文字列。 以下のフラグを組み合わせたビットマスクです。 クォートや無効な符号単位シーケンス、そして文書型の扱いを指定します。 デフォルトは ENT_COMPAT | ENT_HTML401 です。 利用可能な flags 定数 オプションの引数。文字を変換するときに使うエンコーディングを定義します。 省略した場合の encoding のデフォルト値は、 default_charset の値を使います。 技術的にはこの引数を省略可能ですが、 default_charset の指定が入力とは違う文字セットになっている可能性もあるので、 適切な値を指定しておくことを強く推奨します。 この関数を使ううえでは ISO-8859-1 と ISO-8859-15、 UTF-8、cp866、 cp1251、cp1252 そして KOI8-R は事実上同等です。 string 自体がそのエンコーディングにおける有効な文字列である限り、 これらのエンコーディングでは htmlspecialchars() の影響が及ぶ文字がみな同じ位置にあるからです。 サポートされている文字セットの詳細は、記事下のリンクに掲載されています。 double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。 変換対象となる文字 基本的に、対象の文字列と必要に応じてflagsを使用します。 デフォルトではこのように、変換される「&,",',<,>」の中で「'」以外が変換されます。 基本的に使用するのはこの3つのflagsです。 もしENT_NOQUOTESを指定すると、 シングルクート、ダブルクオートともに変換されなくなります。 用途に合わせて使い分けましょう。 htmlspecialchars関数は、XSS(クロスサイトスクリプティング)を防ぐための非常に重要な関数です
HTMLにユーザーの入力した文字列を表示する際、この関数を忘れないようにしましょう。
htmlspecialchars関数
htmlspecialchars
詳細
対応バージョン
PHP 4, PHP 5, PHP 7, PHP 8
説明
特殊文字を HTML エンティティに変換する
htmlspecialchars(
string $string,
int $flags = ENT_COMPAT,
?string $encoding = null,
bool $double_encode = true
): string
string
flags
定数名
説明
ENT_COMPAT
ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES
シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES
シングルクオートとダブルクオートは共に変換されません。
ENT_IGNORE
無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。セキュリティの問題が発生する可能性があります。
ENT_SUBSTITUTE
無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は � となります。
ENT_DISALLOWED
指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは � で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401
コードを HTML 4.01 として処理します。
ENT_XML1
コードを XML 1 として処理します。
ENT_XHTML
コードを XHTML として処理します。
ENT_HTML5
コードを HTML 5 として処理します。
encoding
double_encode
htmlspecialchars 使い方
変換前
変換後
& (アンパサンド)
&
" (ダブルクォート)
ENT_NOQUOTES が指定されていない場合、"
' (シングルクォート)
' (ENT_HTML401 の場合) あるいは ' ( ENT_XML1、ENT_XHTML、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る
< (小なり)
<
> (大なり)
>
//<span onclick="hello('click')">こんにちわ!</span>
$data = '<span onclick="hello('."'click'".')">こんにちわ!</span>';
// $dataを変換
$output = htmlspecialchars($data);
// 出力用
var_dump($output);
string(78) "<span onclick="hello('click')">こんにちわ!</span>"
ちなみに、「&,<,>」に関してはflagsで指定しても変換を停止することはできません。
一番最初のENT_COMPATはデフォルトなので指定する必要はありません。
定数名
説明
ENT_COMPAT
ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES
シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES
シングルクオートとダブルクオートは共に変換されません。
string(68) "<span onclick="hello('click')">こんにちわ!</span>"
参考ページ
参考にした公式ドキュメントのページです。
explode - PHPマニュアル
substr - PHPマニュアル
nl2br - PHPマニュアル
str_replace - PHPマニュアル
strpos - PHPマニュアル
htmlspecialchars - PHPマニュアル