正規表現とは
パターンを指定して、文字列を検索したり置き換えたりする方法のことです。
プログラミング初心者の方はピンと来ないと思います。汗
正規表現は英語で Regular expression
プログラミング言語やエディタ上では略して、Regex
やRegexp
と書かれることが多いので、英語の略称も知っていると役に立つみたいです。
メタ文字
^ 、[ ]、{ }、$
などは本来の文字とは違う特殊な意味があります。
このような特殊な意味を持つ文字を「メタ文字」
と呼びます。
メタ文字には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
$char = 'aAbBcC_ss_rr';
if(preg_match("/aAb/",$char,$result)){//この箇所で検索
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できたArray ( [0] => aAb )
aAbを検索したら別の検索のやり方をやっていきます。
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/\wbB/",$char,$result)){
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できたArray ( [0] => AbB )
i
をつけると大文字小文字は区別しないということなります。
<?php
$char = 'aAbBcC_ss_rr';
if(preg_match("/\wbb/i",$char,$result)){
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できたArray ( [0] => AbB )
[a-z]でやってみると
<?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
$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
$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
$char = 'aAbBcC_ss_rr';
if(preg_match("/[a-zA-Z]{1,}$/i",$char,$result)){
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できたArray ( [0] => rr )
^なら前方一致となります。
<?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
$char = '5aAbBcC_ss_rr';
if(preg_match("/^[a-zA-Z]{1,}/i",$char,$result)){
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できたArray ( [0] => rr )
こうすれば数字も検索できます。
<?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
$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
$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
$char = '5aAbBcC30_ss_rr';
if(preg_match("/.{2,}/i",$char,$result)){
echo '検索できた';
print_r($result);
} else {
echo '検索できなかった';
};
//検索できた( [0] => 5aAbBcC30_ss_rr )
HTMLタグを使っていきます。
<?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
$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 )
正規表現は覚える必要がない
正規表現はプロの開発者でも全部覚えている人はいないです。
調べながら実装していきます。
有益資料、ドキュメント
参考資料