preg_mach関数の書き方がわからない
記号だらけでチンプンカンプン
郵便番号の正規表現が理解できない。
というか、正規表現自体、仕組みを理解していない。
preg_mach関数と正規表現
<?php
if (preg_match('/^[0-9]{7}$/', $postcode)){
echo '郵便番号', $postcode, 'を確認しました。';
}
else{
echo $postcode, 'は適切な番号ではありません。';
}
?>
preg_mach ( ’/ 文字列条件 /’ , 調べる文字列 ) で書く。
この条件の書き方が複雑。。。。
‘/ ABC/’と条件を入れれば、ABCの入力にのみ対応する。
‘/ /’この間に、正規表現で条件を書く。
書かれている正規表現は
^[0-9]{7}$
^は、先頭からの意味。
[0-9]は、0から9のいずれかの一文字。
{7}は、直前の文字が7文字続くの意味。
$は、末尾からの意味。
直前の文字とは一体・・・
{7}の直前の文字は[0-9]、『0から9のいずれかの一文字』=数字
直前の文字は数字
この場合は数字が7文字続く意味。
^[0-9]{7}$ この部分の意味は
先頭と末尾両方から数えて、数字7文字連続する。
つまり、数字7文字でできている文字列。
仮に ^[0-9]{7} と記入すると
先頭から7文字数字が続く。
12345678900ABCと入力しても、先頭から数字7文字続いているので合致する事になる。
ハイフンを含める場合
^[0-9]{3}-[0-9]{4}$
次の3つに分解される
^[0-9]{3} 先頭から数字三文字
- ハイフン
[0-9]{4}$ 後ろから数字4文字
000-0000
郵便番号の配列ルールになる。
パスワードの正規表現
郵便番号の次にパスワードの正規表現を見ていく。
英大文字、小文字、数字を含む8桁のパスワード。
一層意味が解らない。
<?php
$password=$_REQUEST['password'];
if(preg_match('/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}/',$password)){
echo 'パスワード「', $password, '」が入力されました。';
}else{
echo 'パスワード「', $password, '」は条件を満たしていません。';
}
?>
(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}この部分が正規表現になる
長々と書いてあり戸惑う
(?=.*[a-z])この部分を理解する
(?= )は先読みアサーション
条件にマッチするかを調べる(?=条件)
この場合の条件は .*[a-z]
一つずつ見ていく
.は何か1文字
*は直前に文字が無いか連続する
[a-z]半角英小文字の中から一文字1文字
つまり .*[a-z] の条件は
一文字目に英小文字が来る事。
何らかの文字があり、英小文字がどこかで現れる事。
つまり、英小文字が含まれるかどうか。
分解して考える
(?=.*[a-z]) 英小文字があるかを確認
(?=.*[A-Z]) 英大文字があるかを確認
(?=.*[0-9]) 数字があるかを確認
[a-zA-Z0-9] 英小文字、英大文字、数字の中から1文字
{8,} 直前の文字が8連続する。
アルファベット大文字、小文字、数字で書かれた8文字に対して、
英小文字、英大文字、数字が使われているかを確認する。
今っぽい条件のパスワードにする
以下の条件を追加して、
英大文字、、小文字、数字、記号を含む8文字以上32文字以内の文字列を判別する正規表現
記号を含めるために
(?=.*[任意の記号])を追加。
{8,32}で文字数の条件を規定する
コメント