PHPで正規表現


なんとなく正規表現に興味を持った。会社の先輩からも「使えたらバリ便利だよ!」って言われたのでとりあえずどーやるのか調べてみた。

PHPで正規表現を行うには「preg_match()」関数を使うらしい。リファレンスによると、

  • preg_match()関数はpatternで指定した正規表現によりsubjectを検索する。

int preg_match  ( string $pattern  , string $subject  [, array &$matches  [, int $flags  [, int $offset  ]]] )

これではさっぱりわからなかったので、昔買ったPHPの入門本のサンプルを読み返してみた。

■正規表現の書き方

「/(正規表現パターン)/」と囲む(囲み文字をデリミタと呼ぶ)。

で、初歩的な書き方から順番に・・・
★数字のチェック
==================

・文字列に数字の0~9に一致するものがあるか検索
preg_match(“/[0-9]/”,hoge)
「[](ブラケット)」で囲まれた文字はその中の1つの文字と一致するか、という意味
[0-9]は、[0123456789]と同じ。
アルファベットなら[a-z][A-Z]みたいな感じかな?


<?php
$hoge = "hoge0123";
if(preg_match("/[0-9]/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→true
?>

・文字列に3桁の3~7の数字だけで構成された文字列があるか検索
preg_match(“/[3-7]{3}/”,$hoge)
{数字}←数字の桁数を表わす。{3}なら3桁の数字と指定可能

<?php
$hoge = "hoge0123";
if(preg_match("/[3-7]{3}/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→false
?>

・文字列に3~5桁の3~7の数字だけで構成された文字列があるか検索
preg_match(“/[3-7]{3,5}/”,$hoge)
{3,5}←数字を「,」で区切ると「3~5」桁の数字と指定可能

<?php
$hoge = "hoge0123fuga2456";
if(preg_match("/[3-7]{3,5}/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→true
?>

・文字列に3桁以上の3~7の数字だけで構成された文字列があるか検索
preg_match(“/[3-7]{3,}/”,$hoge)
{3,5}←{数字,}で指定した数字以上の桁数という指定

<?php
$hoge = "hoge0123fuga245";
if(preg_match("/[3-7]{3,}/",$moji)){
echo "true";
}else{
echo "false";
}
//返す値→false
?>

・文字列に1桁以上の3~7の数字だけで構成された文字列があるか検索
preg_match(“/[3-7]+/”,$hoge)
[3-7]+/←1桁以上は「+(プラス記号)」で指定可能

<?php
$hoge = "hoge0123fuga245";
if(preg_match("/[3-7]+/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→true
?>

・文字列に0以上の3~7の数字だけで構成された文字列があるか検索
preg_match(“/[3-7]*/”,$hoge)
[3-7]*/←0以上?いまいち使いた方がわからない

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/[3-7]*/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→true
?>

★英字のチェック
==================

・文字列にA~Zに一致するものがないか検索
preg_match(“/[A-Z]*/”,$hoge)
・文字列にa~zに一致するものがないか検索
preg_match(“/[a-z]*/”,$hoge)
・文字列にA~Zまたはa~zに一致するものがないか検索
preg_match(“/[A-Za-z]*/”,$hoge)
["/[]/*”]←「*(アスタリスク)」記号の指定で0回以上の繰り返しにマッチ

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/[a-zA-Z]*/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→true
?>

・5桁以上の英字だけの文字列に一致するものがないか検索
preg_match(“/[a-zA-Z]{5,}/”,$hoge)

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/[a-zA-Z]{5,}/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→false
?>

・『A』が文字列に1文字以上含まれているか検索
preg_match(“/A+/”,$hoge)

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/A+/",$hoge)){
echo "true";
}else{
echo "false";
}
//返す値→false
?>

ここまではなんとなく理解できた。

でもこんな正規表現使う機会はないと思う。

ちょっと実用的になると・・・

・対象以外の文字が含まれているか検索
[]内の最初の文字が「^」の場合は、検索文字列に[]内以外の文字がある場合はtrueを返す
preg_match(“/[^hoge]+/”,$hoge)

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/[^hoge]/",$hoge)){//$hogeの中に「hoge」以外の文字があったら
echo "true";
}else{
echo "false";
}
//返す値→true
?> 
<?php
$hoge = "09012345678";
if(preg_match("/[^0-9]+/",$hoge)){//$hogeの中に数字以外が1文字以上あったら
echo "true";
}else{
echo "false";
}
//返す値→true
?>

・検索対象の文字列が対象の文字から始まっているか検索
[]の外で「^」がある場合、文字列の始まりが「^」直後の文字から始まっている場合はtrueを返す
preg_match(“/^hoge/”,$hoge)

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/^hoge/",$hoge)){//$hogeの文字列が「hoge」からはじまっていたら
echo "true";
}else{
echo "false";
}
//返す値→true
?> 
<?php
$hoge = "-hoge0123fuga2324";
if(preg_match("/^[0-9a-zA-Z]/",$hoge)){//$hogeの文字列が「0~9、a~z、A~Z」のもじからはじまっていたら
echo "true";
}else{
echo "false";
}
//返す値→false
?> 

・検索対象の文字列が対象の文字で終わっているか検索
「$」がある場合、文字列の終わりが「$」の直前の文字列で終わっている場合はtrueを返す
preg_match(“/hoge$/”,$hoge)

<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/hoge$/",$hoge)){//$hogeの文字列が「hoge」で終わっていたら
echo "true";
}else{
echo "false";
}
//返す値→false
?> 
<?php
$hoge = "hoge0123fuga2324";
if(preg_match("/[0-9]$/",$hoge)){//$hogeの文字列が、0~9で終わっていたら
echo "true";
}else{
echo "false";
}
//返す値→true
?> 

これを組み合わせて頭使えば、ちょっとは役に立つかもしれない。本の続きで、「メールアドレスをチェックする」ってとこまでやりましたが、今日はなんだか疲れたので続きは後日にします。

,

  1. #1 by wonder-boys at 6月 5th, 2009

    /[3-7]+/
    って
    「一桁以上」
    というよりは、
    「3~7の数字が1つ以上存在するかどうか」
    ってことなんでは?
    結果は同じだけど。

    だから、/[3-7]*/は
    「3~7の数字が0個以上存在するかどうか」
    ってことなんでは?
    「0」はヒットしないのでは?

    と、本にかいてありました。

  2. #2 by paz at 6月 6th, 2009

    >>wonder-boysさん
    ですね、次の日に会社の方に教わりました。
    正規表現奥深し。

(will not be published)
  1. No trackbacks yet.