なんとなく正規表現に興味を持った。会社の先輩からも「使えたらバリ便利だよ!」って言われたのでとりあえずどーやるのか調べてみた。
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 by wonder-boys at 6月 5th, 2009
/[3-7]+/
って
「一桁以上」
というよりは、
「3~7の数字が1つ以上存在するかどうか」
ってことなんでは?
結果は同じだけど。
だから、/[3-7]*/は
「3~7の数字が0個以上存在するかどうか」
ってことなんでは?
「0」はヒットしないのでは?
と、本にかいてありました。
#2 by paz at 6月 6th, 2009
>>wonder-boysさん
ですね、次の日に会社の方に教わりました。
正規表現奥深し。