Laravelに向けたPHPの正規表現

# 正規表現とは
パターンを指定して、文字列を検索したり置き換えたりする方法のことです。
プログラミング初心者の方はピンと来ないと思います。汗

# 正規表現は英語で Regular expression 
プログラミング言語やエディタ上では略して、```Regex```や```Regexp```と書かれることが多いので、英語の略称も知っていると役に立つみたいです。

# メタ文字
```^ 、[ ]、{ }、$``` などは本来の文字とは違う特殊な意味があります。
このような特殊な意味を持つ文字を```「メタ文字」```と呼びます。

メタ文字には２種類あります。

1. 角カッコ内を除き、 パターン中のどこででも使用できる文字
2. 角カッコで括られた中（文字クラス）でだけ使用できる文字

# 正規表現一覧
マッチングと置き換え
||説明|
|--|--|
|preg_match|文字列内でパターンにマッチする箇所を検索|
|preg_match_all|文字列内でパターンにマッチするすべての箇所を検索|
|preg_replace|文字列内のパターンにマッチする箇所を別の文字列で置換|

|メタ文字|説明|
|--|--|
|.|任意の1文字|
|^|先頭一致|
|$|終端一致|
|0-9|0から9まで|
|[a-z]|a~zまで|
|abc|aまたはbまたはc|
|^abc|aまたはbまたはc以外|
|[]|文字クラス作成|
|{n}|n回繰り返し|
|\w|半角英数字とアンダースコア|
|\W|任意の英数字またはアンダースコア以外の文字|
|\d|数値|
|\D|任意の数値意外とマッチ|
|\s|空白文字|
|\S|任意の空白文字以外の文字とマッチ|

正直パターンが多すぎるので資料のドキュメントから調べてみたください。


# 正規表現を使ってみる
試しに検索してみます。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/aAb/",$char,$result)){//この箇所で検索
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};

//検索できたArray ( [0] => aAb )
```
aAbを検索したら別の検索のやり方をやっていきます。

```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/\wbB/",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};

//検索できたArray ( [0] => AbB )
```
```i```をつけると***大文字小文字は区別しない***ということなります。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/\wbb/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};

//検索できたArray ( [0] => AbB )
```
[a-z]でやってみると
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/[a-z]bb/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};

//検索できたArray ( [0] => AbB )
```
上のように検索できます。次は{}を使っていきます。
aからzとAからZを{6}回の繰り返しで検索します。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/[a-zA-Z]{6}/",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => aAbBcC )
```
***{1,5}にすると1文字以上4文字以下で検索***ということになります。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/[a-zA-Z]{1,4}/",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => aAbB )
```
***$は後方一致、{1,}は1文字以上***という意味です。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/[a-zA-Z]{1,}$/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => rr )
```
***^なら前方一致***となります。
```php
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/^[a-zA-Z]{1,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => aAbBcC )
```
5とかが入ると検索できなくなります。
```php
<?php
$char = '5aAbBcC_ss_rr';
if(preg_match("/^[a-zA-Z]{1,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => rr )
```
こうすれば数字も検索できます。
```php
<?php
$char = '5aAbBcC_ss_rr';
if(preg_match("/^[0-9a-zA-Z]{1,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => 5aAbBcC )
```
^を[]の中に入れると挙動は変わります。

```php
<?php
$char = '5aAbBcC_ss_rr';
if(preg_match("/[^a-zA-Z]{1,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => 5 )
```
は```[^a-zA-Z]は文字以外```となります。
{2,}とかにすると変わってきます。
```php
<?php
$char = '5aAbBcC30_ss_rr';
if(preg_match("/[^a-zA-Z]{2,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] => 30_ )
```
***.を使って2文字以上の繰り返し***ということになります。
```php
<?php
$char = '5aAbBcC30_ss_rr';
if(preg_match("/.{2,}/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できた( [0] => 5aAbBcC30_ss_rr )
```
HTMLタグを使っていきます。
```php
<?php
$char = '<h2>5aAbBcC30_ss_rr</h2>';
if(preg_match("/<h2>.{2,}<\/h2>/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] =>
//5aAbBcC30_ss_rr
//)
```
タグの中身のみをとる場合は
```php
<?php
$char = '<h2>5aAbBcC30_ss_rr</h2>';
if(preg_match("/<h2>(.{2,})<\/h2>/i",$char,$result)){
    echo '検索できた';
    print_r($result);
} else {
    echo '検索できなかった';
};
//検索できたArray ( [0] =>
//5aAbBcC30_ss_rr

//[1] => 5aAbBcC30_ss_rr )
```

# 正規表現は覚える必要がない
***正規表現はプロの開発者でも全部覚えている人はいない***です。
調べながら実装していきます。


# 有益資料、ドキュメント

https://qiita.com/jnchito/items/893c887fbf19e17d3ff9

https://www.webdesignleaves.com/pr/php/php_basic_03.php

https://www.php.net/manual/ja/reference.pcre.pattern.syntax.php

# 参考資料

https://www.udemy.com/course/backend-tutorial/