PHPにおける文字列置き換え大全

コピペして使うように作りましたー
間違ってたら教えてください！！
#目次
[よく使う正規表現のパターンマッチ](#よく使う正規表現のパターンマッチ)
・[携帯番号の例](#携帯番号の例)
・[郵便番号の例](#郵便番号の例)
・[全角カタカナの例](#全角カタカナの例)
・[なんちゃってメールアドレスの例](#なんちゃってメールアドレスの例)
・[クレジットカード全社の例](#クレジットカード全社の例)
・[IPアドレスの例](#IPアドレスの例)
[文字列を繰り返す方法](#文字列を繰り返す方法)
[入力値を統一する方法](#入力値を統一する方法)
・[小文字から大文字に変換](#小文字から大文字に変換)
・[大文字から小文字に変換](#大文字から小文字に変換)
・[全角を半角に変換](#全角を半角に変換)
・[半角を全角に変換](#半角を全角に変換)
・[カナ文字の変換](#カナ文字の変換)
[文字エンコードの変換](#文字エンコードの変換)
[文字列の一部を切り抜く方法](#文字列の一部を切り抜く方法)
[文字列の一部が一致しているか確認する](#文字列の一部が一致しているか確認する)
[文字列の置き換え](#文字列の置き換え)

#よく使う正規表現のパターンマッチ
正規表現の基本的な構文

|構文|説明|
|:----:|:----:|
|.|改行文字以外の任意の一文字|
|?|0回か1回だけのマッチ|
|*|0回以上の繰り返し|
|+|1回以上の繰り返し|
|{n}|n回の繰り返し|
|{n,m}|n回以上m回以上の繰り返し|
|^|文字列及び行の始まり|
|$|文字列及び行の終わり|
|[]|文字クラス[a-z]ならaからzまでの一文字|
|\A|文字列の始まり|
|\z|文字列の終わり|
|\w|単語構成文字[a-zA-Z0-9_]とは異なる可能性がある|
|\d|数字|
|\s|スペースタブ改行などの空白文字|
|\S|空白以外の全ての文字|
|()|パターンのグループ化|

``パターン修飾子はデリミタ(\)の後に書く``

|パターン修飾子|説明|
|:----:|:----:|
|i|大文字と小文字を区別しない|
|m|行単位でマッチ|
|s|「.」を改行文字にもマッチさせる|
|u|パターン文字列をUTF-8エンコードとして扱う|
|x|エスケープするか文字クラスの内部を除いてパターン中の空白文字を無視|

``\``をマッチさせるには
``\\\\``とする必要がある
正規表現でもPHPでもエスケープするため

##携帯番号の例

```example.php
//080-1234-5678, 09012345678
$tel_pattern = '/\A(090|080|070)-?\d{4}-?\d{4}\z/';
```

##郵便番号の例

```example.php
//111-1112, 1111112
$postal_code_pattern = '/\A\d{3}-?\d{4}\z';
```

##全角カタカナの例

```example.php
$em_kana_pattern = '/\A[\x{30A1}-\x{30FC}().-]+\x/u';
```

##半角カタカナの例

```example.php
$en_kana_pattern = '/\A[\x{FF66}-\x{FF9F}]+\x/u';
```

##なんちゃってメールアドレスの例

```example.php
$mail_pattern = '/\A[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[\p{L}0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*\.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})\z/ui';
```

##クレジットカード全社の例

```example.php
$cards_pattern = '/\A(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|^(?:2131|1800|35\d{3})\d{11}$)\z/';
$visa_pattern = '/\A4\\d{12}(\\d{3})?\z/';
$master_pattern = '/\A5[1-5]\\d{14}\z/';
$jcb_pattern = '/\A(3\\d{4}|2100|1800)\\d{11}\z/';
$amex_pattern = '/\A3[4|7]\\d{13}\z/';
$diners_pattern = '/\A(?:3(0[0-5]|[68]\\d)\\d{11})|(?:5[1-5]\\d{14})\z/';
$discovery_pattern = '/\A(?:6011|650\\d)\\d{12}\z/';
```

##IPアドレスの例

```example.php
$ipv4_pattern = '\A(?:(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\z';

$ipv6_pattern = '\A((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\z';
```

参考
https://qiita.com/ryounagaoka/items/dc9fe731d0fa6f8f9daa

#文字列を繰り返す方法
``str_repeat``を使う

```example.php
str_repeat('*', 10);
```

#入力値を統一する方法
##小文字から大文字に変換
``strtoupper()``関数を使う
``mb_strtoupper()``関数を使えば全角のアルファベットも変換する
``ucfirst()``関数は最初の文字だけを大文字に変換し
``ucwords()``関数は最初の単語だけを大文字に変換します

##大文字から小文字に変換
``strtolower()``関数を使う
``mb_strtolower()``関数を使えば、全角のアルファベットも変換する

##全角を半角に変換
``mb_conver_kana()``関数を使う

|オプション|説明|
|:----:|:----:|
|r|全角英字を半角に変換|
|n|全角数字を半角に変換|
|a|全角英数字を半角に変換|
|s|全角スペースを半角に変換|

```example.php
mb_convert_kana($text, 'r');
```

##半角を全角に変換
同じく``mb_convert_kana()``関数の第二引数を使う

|オプション|説明|
|:----:|:----:|
|R|半角英字を全角に変換|
|N|半角数字を全角に変換|
|A|半角英数字を全角に変換|
|S|半角スペースを全角に変換|

#カナ文字の変換
同じく``mb_convert_kana()``関数の第二引数を使う

|オプション|説明|
|:----:|:----:|
|k|全角カタカナを半角カタカナに変換|
|K|半角カタカナを全角カタカナに変換|
|h|全角平仮名を半角平仮名に変換|
|H|半角カタカナを全角平仮名に変換|
|c|全角カタカナを全角平仮名に変換|
|C|全角平仮名を全角カタカナに変換|
|V|濁点付きの文字を一文字に変換、KやHと共に使う|
|s|全角スペースを半角に変換|
|S|半角スペースを全角に変換|

```example.php
mb_conver_kana($text, 'HV');
```

#文字エンコードの変換
``mb_convert_encoding()``関数を使う

```example.php
mb_convert_encoding(mb_convert_encoding($text, 'SJIS'), 'UTF-8', 'SJIS');
mb_convert_encoding(mb_convert_encoding($text, 'EUC-JP'), 'UTF-8', 'EUC-JP');
```

#文字列の一部を切り抜く方法
``mb_substr('文字列', '開始位置'[, '文字数'])``を使う
文字数を省略した場合、開始位置から末尾までの文字列の全てを返す
また先頭は0から始まる
マイナスを指定することもできる

```example.php
$text = 'asdfghjkl';
echo mb_substr($text, 0, 5); //asdfg
echo mb_substr($text, 2); //dfghjkl
echo mb_substr($text, -5); //lkjhg
```

#文字列の一部が一致しているか確認する
``mb_strpos()``関数を使う
最初に見つかった位置を数値で返す

```example.php
if (mb_strpos($target, $keyword) === false) echo $keyword . 'が見つかりませんでした';
```
演算子は'==='を使う必要があります
検索する文字が先頭に見つかってしまった場合に0を返すからです。

#文字列の置き換え
``str_replace()``関数を使う

```example.php
echo str_replace('before', 'after', $target);
```