4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHP よく使うString関数まとめ

Last updated at Posted at 2021-09-11

本記事の内容

本記事では、String関数、マルチバイト文字列関数である、

  • explode (文字列を指定した文字列により分割する)
  • substr (文字列の一部分を返す)
  • nl2br (改行文字の前に HTML の改行タグを挿入する)
  • str_replace (検索文字列に一致したすべての文字列を置換する)
  • strpos (文字列内の部分文字列が最初に現れる場所を見つける, 文字列が存在するかの確認)
  • htmlspecialchars (特殊文字を HTML エンティティに変換する)
    の使い方をざっくりまとめています。
    さらに詳しく知りたいという方は、記事最後に公式ドキュメントのページを一覧で記載しています。
    (順次追加です)

一つの関数あたり、

  • 関数の詳細(公式リファレンスに沿った具体的なもの)
  • ざっくりした説明

の二部構成です。
 使い方に関しては、ざっくりした説明だけを見ていただければ理解できる程の情報量を簡潔にまとめています。
(誤解を招く表現等ありましたらコメントでお願いします)

explode関数

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 の要素が含まれ、その最後の要素には string の残りの部分が全て含まれます。
もし limit パラメータが負の場合、 最後の -limit 個の要素を除く全ての構成要素が返されます。
limit パラメータがゼロの場合は、1 を指定したものとみなされます。

※基本的に使用する場合limitの指定は必要ではありません

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関数
substr関数
substr 詳細
対応バージョン PHP 4, PHP 5, PHP 7, PHP 8
説明 文字列の一部分を切り取る
substr(string $string, int $offset, ?int $length = null): string

string

入力文字列。

offset

offset が正の場合、返される文字列は、 string の 0 から数えて offset番目から始まる文字列となります。 例えば、文字列'abcdef'において位置 0にある文字は、'a'であり、 位置2には'c'があります。
offset が負の場合、返される文字列は、 stringの後ろから数えて offset番目から始まる文字列となります。
string の長さが offset 文字より短い場合は false が返されます。

例1 負の offset の使用

$rest = substr("abcdef", -1);    // "f" を返す
$rest = substr("abcdef", -2);    // "ef" を返す
$rest = substr("abcdef", -3, 1); // "d" を返す

length

length が指定され、かつ正である場合、 返される文字列は offset (string の長さに依存します) から数えて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となります。

マルチバイトを扱う場合は、mb_substrを使用する

## nl2br関数
nl2br関数
nl2br 詳細
対応バージョン PHP 4, PHP 5, PHP 7, PHP 8
説明 改行文字の前に HTML の改行タグを挿入する
nl2br(string $string, bool $use_xhtml = true): string

string

入力文字列。

use_xhtml

XHTML 準拠の改行を使うか否か。
(デフォルト:true)

nl2br 使い方

$data = "aiueo\nkakikukeko";
// \nの前に<br />を挿入
$output = nl2br($data);
// 出力用
var_dump($output);
出力
string(22) "aiueo<br />\nkakikukeko"

改行コードをそのままHTMLに変換する時に便利です。
また、

$output = nl2br($data,false);

とすることで、**<br />ではなく、<br>**と出力することができます。

## str_replace関数
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

探したい値。needle (針) と呼ばれることもあります。 配列を使えば、複数の値を指定することもできます。

replace

見つかった search を置き換える値。 配列を使えば、複数の値を指定することもできます。

subject

検索・置換の対象となる文字列あるいは配列。 haystack (干し草の山) と呼ばれることもあります。

subject が配列の場合、 subject の各エントリについて検索と置換が行われ、 返り値は同様に配列となります。

count

指定した場合は、マッチして置換が行われた箇所の個数がここに格納されます。

str_replace 使い方

文字列バージョン

一つを置き換える場合に使用します。

$data = "aiueokakikukeko";
// kaをsaに置き換える
$output = str_replace('ka','sa',$data);
// 出力用
var_dump($output);
出力
string(15) "aiueosakikukeko"

配列バージョン

str_replaceは配列で指定することで、複数を同時に置き換えることも可能です。

$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);

と四番目の引数に新しい変数名を指定することで、この例の場合は$countにint型で挿入してくれます。
例えば先ほどの例であれば1、何も置き換えをしなければ0となります。

## strpos関数
strpos関数
strpos 詳細
対応バージョン PHP 4, PHP 5, PHP 7, PHP 8
説明 文字列内の部分文字列が最初に現れる場所を見つける
strpos(string $haystack, string $needle, int $offset = 0): int|false

haystack

検索を行う文字列。

needle

PHP 8.0.0 より前のバージョンでは、needle が文字列でない場合、 数値に変換され、文字の通常の値として扱われていました。 この振る舞いは PHP 7.3.0 以降では推奨されないので、 この機能を使用しないことを強く推奨します。 意図した動作に依存する場合、 needle を string に明示的にキャストするか、 明示的に chr() 関数を呼び出すべきでしょう。

offset

指定すると、文字列内での検索開始位置がその位置になります。 負の数を指定すると、文字列の末尾からこの数だけ戻った場所から検索を開始します。

strpos 使い方

文字列が存在するかの確認

strposでは検索のほかに、文字列が存在するかの確認に利用できます。

$data = "aiueokakikukeko";
// $dataにkoが存在するかを確認する
if(strpos($data,('ko'))!==false){
  $output="存在します";
}else{
  $output="存在しません";
}
// 出力用
var_dump($output);
出力
string(15) "存在します"

これは、検索する文字列が存在しない場合にstrposがfalseを返却することを利用して判断しています。

文字列を検索する場合

strposの標準の使い方です。

$data = "aiueokakikukeko";
// $dataにkoがどこに存在するかを確認する
$output = strpos($data,'ko');
// 出力用
var_dump($output);
出力
int(13)

ちなみにカウントの開始位置が0から始まる為、この結果では14番目(13+1)にkoが最初に出現したことが分かります。

0からカウントされることに注意

## htmlspecialchars関数
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_HTML401 です。

利用可能な flags 定数

定数名 説明
ENT_COMPAT ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES シングルクオートとダブルクオートは共に変換されません。
ENT_IGNORE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。セキュリティの問題が発生する可能性があります。
ENT_SUBSTITUTE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は &#xFFFD; となります。
ENT_DISALLOWED 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#xFFFD; で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401 コードを HTML 4.01 として処理します。
ENT_XML1 コードを XML 1 として処理します。
ENT_XHTML コードを XHTML として処理します。
ENT_HTML5 コードを HTML 5 として処理します。

encoding

オプションの引数。文字を変換するときに使うエンコーディングを定義します。

省略した場合の encoding のデフォルト値は、 default_charset の値を使います。

技術的にはこの引数を省略可能ですが、 default_charset の指定が入力とは違う文字セットになっている可能性もあるので、 適切な値を指定しておくことを強く推奨します。

この関数を使ううえでは ISO-8859-1 と ISO-8859-15、 UTF-8、cp866、 cp1251、cp1252 そして KOI8-R は事実上同等です。 string 自体がそのエンコーディングにおける有効な文字列である限り、 これらのエンコーディングでは htmlspecialchars() の影響が及ぶ文字がみな同じ位置にあるからです。

サポートされている文字セットの詳細は、記事下のリンクに掲載されています。

double_encode

double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。

htmlspecialchars 使い方

変換対象となる文字

変換前 変換後
& (アンパサンド) &amp;
" (ダブルクォート) ENT_NOQUOTES が指定されていない場合、&quot;
' (シングルクォート) &#039; (ENT_HTML401 の場合) あるいは &apos; ( ENT_XML1、ENT_XHTML、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る
< (小なり) &lt;
> (大なり) &gt;

基本的に、対象の文字列と必要に応じてflagsを使用します。

//<span onclick="hello('click')">こんにちわ!</span>
$data = '<span onclick="hello('."'click'".')">こんにちわ!</span>';
// $dataを変換
$output = htmlspecialchars($data);
// 出力用
var_dump($output);
出力
string(78) "&lt;span onclick=&quot;hello('click')&quot;&gt;こんにちわ!&lt;/span&gt;"

デフォルトではこのように、変換される「&,",',<,>」の中で「'」以外が変換されます。
ちなみに、「&,<,>」に関してはflagsで指定しても変換を停止することはできません。

基本的に使用するのはこの3つのflagsです。
一番最初のENT_COMPATはデフォルトなので指定する必要はありません。

定数名 説明
ENT_COMPAT ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES シングルクオートとダブルクオートは共に変換されません。

もしENT_NOQUOTESを指定すると、

出力
string(68) "&lt;span onclick="hello('click')"&gt;こんにちわ!&lt;/span&gt;"

シングルクート、ダブルクオートともに変換されなくなります。

用途に合わせて使い分けましょう。

htmlspecialchars関数は、XSS(クロスサイトスクリプティング)を防ぐための非常に重要な関数です
HTMLにユーザーの入力した文字列を表示する際、この関数を忘れないようにしましょう。

XSS(クロスサイトスクリプティング) - wikipedia

# 参考ページ 参考にした公式ドキュメントのページです。

explode - PHPマニュアル
substr - PHPマニュアル
nl2br - PHPマニュアル
str_replace - PHPマニュアル
strpos - PHPマニュアル
htmlspecialchars - PHPマニュアル

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?