パターンマッチング

パターンマッチング

正規表現による文字列のマッチング

正規表現は記号を使用し、文字列の範囲を指定して、パターンが一致するものを検索します。

ereg()関数は、記号の「^」や「$」を使用し、文字列のパターンを指定します。

文字列の一部分をマッチ

    <?php
        $str1 = "Start is a day";
        $str2 = "Please teach ending of your schedule";

        if(ereg("^Start",$str1)) echo "Startから始まる文字列です。<br />¥n";

        if(ereg("schedule$",$str2)) echo "scheduleで終わる文字列です。<br />¥n";
    ?>
    

実行結果

Startから始まる文字列です。
scheduleで終わる文字列です。

上記のスクリプトでは、「if(ereg("^Start",$str1))」の「^」は先頭を意味し、「Start」から始まる文字列に一致します。すなわち、文字列の先頭に「Start」が存在した場合、echoの「Startから始まる文字列です。」が出力されます。

if(ereg("schedule$",$str2))の「$」は末尾を表し「schedule」で終わる文字列に一致します。すなわち、文字列の末尾に「schedule」が存在した場合、echoの「scheduleで終わる文字列です。」が出力されます。

一連の文字列とのマッチング

1~9、a~zなどの文字列と一致するものを検索することができます。

アルファベットの文字列、数字の文字列と一致

    <?php
        $str1 = "PHP Product";
        $str2 = "12349-5826-31322";

        if(ereg("[a-z]",$str1)) echo "\$str1はaからzまでの小文字を含みます。<br />¥n";

        if(ereg("[0-9\]-",$str2)) echo "\$str2は0~9までの数字とハイフンを含みます。<br />¥n";
    ?>
    

実行結果

$str1はaからzまでの小文字を含みます。
$str2は0~9までの数字とハイフンを含みます。

上記のスクリプトでは変数$str1はif(ereg("[a-z]",$str1))の、「[](角かっこ)」によりアルファベット文字列の範囲を指定しています。この場合は[a-z]としているので、「a~z」までがマッチする範囲となります。すなわち変数$str1に、一個でも小文字のアルファベットが存在している場合、echoの「$str1はaからzまでの小文字を含みます。」が出力されます。

$str2はif(ereg("[0-9\]-",$str2))の「[](かっこ)」と「-(ハイフン)」により文字列の範囲を指定しています。この場合は「0~9」と「-」がマッチする範囲となります。すなわち、変数$str2に「0~9」のいずれかの数字と「-」が存在した場合、echoの「$str2は0~9までの数字とハイフンを含みます。」が出力されます。

文字の出現回数でのマッチング

文字列の中で、繰り返し使用される文字と一致させるためには、「{}(中かっこ)」によって出現回数を指定します。

    <?php
        $str = "ABCDEFG123HIJK";

        if(ereg("[0-9]{3}",$str))
        echo "¥$strは0から9までの数字を3つ含む文字列です。<br />¥n";
    ?>
    

実行結果

$strは0から9までの数字を3つ含む文字列です。

上記のスクリプトでは、「if(ereg("[0-9]{3}",$str))」の{3}により文字列の中で、繰り返し使用される回数を「3回」と指定しています。すなわち、変数$strに3つ以上「0~9」の数字が存在した場合、echoの「$strは0から9までの数字を3つ含む文字列です。」が出力されます。

文字の出現を回数ではなく範囲で指定する場合は、「,(カンマ)」で区切り指定します。

範囲による指定

    <?php
       $str = "ABCDEFG123HIJK2589LMN";

       if(ereg("[0-9]{1,10}",$str))
       echo "¥$strは0から9までの数字を1個から10個含む文字列です。<br />¥n";
    ?>
    

実行結果

$strは0から9までの数字を1個から10個含む文字列です。

上記のスクリプトでは、if(ereg("[0-9]{1,10}",$str))の{1,10}によって出現回数を範囲で指定しています。

正規表現関数

パターン検索とマッチング

ereg()関数は、引数の文字列とパターンの一致するものを検索します。

ereg(pattern,string,[regs])

文字列の検索

    <?php
       $str = "XENOPHY";
       if(ereg("^X",$str))
       echo "xFrameworkPX";
    ?>
    

実行結果

xFrameworkPX

上記スクリプトでは、変数$strの値「XENOPHY」が「Xから始まる文字列」に該当するので、メッセージのxFrameworkPXがechoで出力されます。

パターン検索と置換

ereg_replace()関数は、引数にある文字列と一致する文字列を置換します。

ereg_replace(pattern,replacement,string)

パターンが一致する文字列を置き換える

    <?php
        $str = "PHP Product";
        echo ereg_replace("PHP","MySQL",$str);
    ?>
    

実行結果

MySQL Product

上記のスクリプトでは、変数$strに入っている「PHP」と一致する文字列を「MySQL」に置き換えています。ただ、ereg_replace()関数は変数に入っている文字列が「PHP」で、引数に入っている文字が「php」だと置換することができません(変数に入っている文字列が置換されずそのまま出力される)。文字のパターンマッチングをする際に、大文字、小文字の区別なく置換したい場合には、eregi_replace()関数を使用します。

eregi_replace()関数で置換

    <?php
        $str = "php Product";
        echo eregi_replace("PHP","MySQL",$str);
    ?>
    

実行結果

MySQL Product

上記スクリプトでは、「$str = "php Product";」の「php」が小文字で「eregi_replace("PHP","MySQL",$str);」の「PHP」が大文字ですが、実行結果から大文字小文字の区別なく置換できていることがわかります。

文字列を分割する

split()関数は、引数にある文字列を区切り文字で分割して配列として返すことができます。

split(pattern,string,[limit])

区切り文字で文字列を分割する

    <?php
        $str = "January February March April May June July August September October November December";
        $year = split(" ",$str); //半角の空白で区切っている
        echo "$year[0], $year[1], $year[2], $year[3], $year[4], $year[5], $year[6], $year[7], $year[8], $year[9],
        $year[10] ,$year[11]";
    ?>
    

実行結果

January, February, March, April, May, June, July, August, September, October, November ,December

上記のスクリプトでは、変数$strに入っている文字列を「" "(半角の空白)」を区切り文字とし、分割をして、それらの結果を配列としてそれぞれ$yearに格納されています。

特殊文字

特殊文字

PHPの正規表現で使用される特殊文字と言われるものに関して紹介していきます。

¥

特殊文字の前に記述することによって、特殊文字が通常の文字として認識されます。逆に、通常の文字の前に記述すると通常の文字が特殊文字として認識されます。

¥$ 通常の文字の「$」として認識と認識される。
¥t //特殊記号のタブ文字として認識される。

*

*の前にある文字が、0もしくは連続して存在している場合に、その全ての文字列に一致する。

Ju* 「June」のJu、「July」のJに一致する。

+

+の前の文字が一個、もしくは連続して存在する場合に、その全ての文字列に一致する。

u+ 「June」の「u」1文字、「Juuuuuuune」にある全ての「u」に一致する。

?

?の前にある文字が一個、もしくは存在しないものに一致します。

June? 「Jun」、「June」に一致します。

.

.は改行記号「¥n」以外の文字に一致します。

|

論理式にあるorに相当します。

string1|string2 文字列string1またはstring2のどちらかと一致する。