PHP よく使うString関数まとめ

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

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

一つの関数あたり、

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

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

## explode関数
<details><summary>explode関数</summary><div>

| explode | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 文字列を区切り文字によって分割し、配列として保存する |

```php
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
```

### separator
区切り文字列

### string
入力文字列

### limit
limit に正の値が指定された場合、返される配列には 最大 limit の要素が含まれ、その最後の要素には string の残りの部分が全て含まれます。
もし limit パラメータが負の場合、 最後の -limit 個の要素を除く全ての構成要素が返されます。
limit パラメータがゼロの場合は、1 を指定したものとみなされます。

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

## explode 使い方

```php
$data = "apple,banana,orange";
$output = explode(',', $data);
// 出力用
var_dump($output);
```
```php:出力
array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "banana"
  [2]=>
  string(6) "orange"
}
```
区切り文字を「,」に指定したため、文字列の「,」の部分で三分割されています。
非常に便利な関数です。

</div></details>
## substr関数
<details><summary>substr関数</summary><div>

| substr | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 文字列の一部分を切り取る |

```php
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 の使用

```php
$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 使い方

```php
$data = "aiueo";
// 1番目から1バイト抜き取る
$output = substr($data,0,1);
// 出力用
var_dump($output);
```
```php
// 出力
string(1) "a"
```
ここで注目してほしいところが、「**バイト**」単位であることです。
その為、日本語などマルチバイト文字では適切に処理ができません。
マルチバイト文字を少しでも使う可能性がある場合、mb_substr関数を使用してください。

```php
$data = "あいうえお";
// 2番目から1文字抜き取る
$output = mb_substr($data,1,1);
// 出力用
var_dump($output);
```
```php:出力
string(3) "い"
```
「**バイト**」ではなく「**文字**」で設定が可能です。
また、二番目の引数は、0から数え始めます。例えば10文字目であれば9となります。

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

</div></details>
## nl2br関数
<details><summary>nl2br関数</summary><div>

| nl2br | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 改行文字の前に HTML の改行タグを挿入する |

```php
nl2br(string $string, bool $use_xhtml = true): string
```

### string
入力文字列。

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

## nl2br 使い方

```php
$data = "aiueo\nkakikukeko";
// \nの前に<br />を挿入
$output = nl2br($data);
// 出力用
var_dump($output);
```
```php:出力
string(22) "aiueo<br />\nkakikukeko"
```
改行コードをそのままHTMLに変換する時に便利です。
また、

```php
$output = nl2br($data,false);
```
とすることで、**\<br />**ではなく、**\<br>**と出力することができます。

</div></details>
## str_replace関数
<details><summary>str_replace関数</summary><div>

| str_replace | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 検索文字列に一致したすべての文字列を置換する |

```php
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 使い方
### 文字列バージョン
一つを置き換える場合に使用します。

```php
$data = "aiueokakikukeko";
// kaをsaに置き換える
$output = str_replace('ka','sa',$data);
// 出力用
var_dump($output);
```
```php:出力
string(15) "aiueosakikukeko"
```
### 配列バージョン
str_replaceは配列で指定することで、複数を同時に置き換えることも可能です。

```php
$data = "aiueokakikukeko";
// kaをsaに、kiをsiに置き換える
$output = str_replace(['ka','ki'],['sa','si'],$data);
// 出力用
var_dump($output);
```
```php:出力
string(15) "aiueosasikukeko"
```
配列の順番通りに置き換えてくれます。

また、何個置き換えたのかを知りたいときは、

```php
$output = str_replace(['ka','ki'],['sa','si'],$data,$count);
```
と四番目の引数に新しい変数名を指定することで、この例の場合は$countにint型で挿入してくれます。
例えば先ほどの例であれば1、何も置き換えをしなければ0となります。

</div></details>
## strpos関数
<details><summary>strpos関数</summary><div>

| strpos | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 文字列内の部分文字列が最初に現れる場所を見つける |

```php
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では検索のほかに、文字列が存在するかの確認に利用できます。

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

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

```php
$data = "aiueokakikukeko";
// $dataにkoがどこに存在するかを確認する
$output = strpos($data,'ko');
// 出力用
var_dump($output);
```
```php:出力
int(13)
```
ちなみにカウントの開始位置が0から始まる為、この結果では14番目(13+1)にkoが最初に出現したことが分かります。

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

</div></details>
## htmlspecialchars関数
<details><summary>htmlspecialchars関数</summary><div>

| htmlspecialchars | 詳細 |
|:-|:-|
| 対応バージョン | PHP 4, PHP 5, PHP 7, PHP 8 |
| 説明 | 特殊文字を HTML エンティティに変換する |

```php
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を使用します。

```php
//<span onclick="hello('click')">こんにちわ！</span>
$data = '<span onclick="hello('."'click'".')">こんにちわ！</span>';
// $dataを変換
$output = htmlspecialchars($data);
// 出力用
var_dump($output);
```
```php:出力
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を指定すると、

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

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

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


:::note info
htmlspecialchars関数は、XSS(クロスサイトスクリプティング)を防ぐための非常に重要な関数です
HTMLにユーザーの入力した文字列を表示する際、この関数を忘れないようにしましょう。
:::
[XSS(クロスサイトスクリプティング) - wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)

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

[explode - PHPマニュアル](https://www.php.net/manual/ja/function.explode.php)
[substr - PHPマニュアル](https://www.php.net/manual/ja/function.substr.php)
[nl2br - PHPマニュアル](https://www.php.net/manual/ja/function.nl2br.php)
[str_replace - PHPマニュアル](https://www.php.net/manual/ja/function.str-replace.php)
[strpos - PHPマニュアル](https://www.php.net/manual/ja/function.strpos.php)
[htmlspecialchars - PHPマニュアル](https://www.php.net/manual/ja/function.htmlspecialchars.php)