今回は、特定の文字列を検索・置換するための正規表現のパターンの表記方法をご紹介します。
正規表現を使うにはメタ文字という特別な意味を持つ文字を使ってパターンを表記します。
下記にメタ文字を記しますが、使い方の詳細は後ほどご紹介しますので
こういったメタ文字がある。程度で覚えていただければと思います。
メタ文字 | 意味 |
.(ピリオド) | 任意の一文字 |
* | 直前の文字が0個以上 |
+ | 直前の文字が1個以上 |
^ | 文字列の先頭。文字クラス内では否定 |
$ | 文字列の末尾。 |
? | 直前の文字が0個、または1個 |
[ ] | [ ]内の任意な一文字 |
| | OR |
これら以外にも沢山メタ文字はありますが、使い方さえ理解すればメタ文字を変えるだけで
様々なパターンを表現出来ますので、メタ文字の詳細は割愛します。
PHPで正規表現を行うために様々な関数が用意されていますが
今回はpreg_match_allをつかってマッチングを行いたいと思います。
abと任意な一文字
$string = "abc"; preg_match_all("/ab./", $string, $matched); var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(3) "abc" } }と出力されます
abとbが0個以上の時にマッチ
$string = "ac"; preg_match_all("/ab*./", $string, $matched); var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(2) "ac" } }
abとbが1個以上の時にマッチ
$string = "ac"; preg_match_all("/ab+./", $string, $matched); var_dump($matched); //array(1) { [0]=> array(0) { } }
先頭がbもしくはaの時にマッチ
$string = "abc"; if(preg_match_all("/^b/", $string, $matched)){ var_dump($matched); //array(1) { [0]=> array(0) { } } }elseif(preg_match_all("/^a/", $string, $matched)){ var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(1) "a" } } }
末尾がbもしくはcの時にマッチ
$string = "abc"; if(preg_match_all("/..b$/", $string, $matched)){ var_dump($matched); //array(1) { [0]=> array(0) { } } }elseif(preg_match_all("/..c$/", $string, $matched)){ var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(3) "abc" } } }
abとzが0個、もしくはzが1個以上の時にマッチ
$string = "abc"; preg_match_all("/abz?/", $string, $matched); var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(2) "ab" } }
上記では少しだけメタ文字を使ってパターンを表現することが出来ました。
ですが、実際にはabcという様な固定値ではなくて可変値であることが多いと思います。
可変値から、英語・数字だけを取り出したい。など、様々あるかと思いますので、
そういった場合には、文字クラスを使います。
文字クラスとは[a-z]のようなパターンの事を言いますが、括った文字にマッチします。
aからzと0から9がマッチ※1
$string = "abc123"; preg_match_all("/[a-z0-9]/", $string, $matched); var_dump($matched); //array(1) { [0]=> array(6) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "1" [4]=> string(1) "2" [5]=> string(1) "3" } }
※1-全角、大文字はマッチしません。
マッチさせるには、大文字を指定したり、オプションをつけたりします。
上記例では、確かにパターン通りマッチしましたが、一文字づつ配列に格納されているので
アルファベットと数値に配列を分けて格納したい場合は、戻り値としては望ましくありません。
こういった問題を解決するために、文字クラスにメタ文字を付け加えます。
aからz、一文字以上マッチ
$string = "abc123"; preg_match_all("/[a-z]+/", $string, $matched); var_dump($matched); //array(1) { [0]=> array(1) { [0]=> string(3) "abc" } }
確かにアルファベットはマッチしましたが、数値がマッチしていません。
数値をパターンに含んでいないので、当然ですが、
数字をマッチさせるために、パターンの部分を
[a-z0-9]+としても
//array(1) { [0]=> array(1) { [0]=> string(6) “abc123” } }
となりますので、今回望んでいる配列ではありません。
アルファベットと数値を別々の配列に格納するには、
aからz、一文字以上にマッチ。「もしくは」0から9一文字以上マッチ
$string = "abc123"; preg_match_all("/[a-z]+|[0-9]+/", $string, $matched); var_dump($matched); //array(1) { [0]=> array(2) { [0]=> string(3) "abc" [1]=> string(3) "123" } }
とします。
よく見ていただくと、[0-9]の左に、メタ文字「|」ORが入っているかと思います。
また、文字クラスにメタ文字の「^」を[^a-z]というふうに先頭に加えていただくことで
文字クラスを否定することになり、aからzは配列に格納されません。
今回は、正規表現の初歩をご紹介させていただきましたが、
実際に携帯サイトを作っていくうえで、どのような時に正規表現を使うかというと、
ユーザーエージェントであったり、メールアドレスの判別に使う事が多いと思います。